结构体指针和函数(结构体指针和结构体变量在调用函数中的区别)

:暂无数据 2026-10-04 05:50:02 :0

结构体指针和函数(结构体指针和结构体变量在调用函数中的区别)

各位老铁们好,相信很多人对结构体指针和函数都不是特别的了解,因此呢,今天就来为大家分享下关于结构体指针和函数以及结构体指针和结构体变量在调用函数中的区别的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

结构体指针和结构体变量在调用函数中的区别

你的理解是对的。
形参是结构体变量的,你对该结构体的所有修改都不会影响到实参,因为形参是实参的一个完整拷贝。
形参是结构体指针的,你对该结构体的修改直接影响实参的结构体数据。因为形参和实参都指向同一个内存区块。注意:形参是一个指针,如果只改变指针本身,则不影响实参。

结构体内结构体指针是,在函数中对结构体指针进行操作值会发生变化

关键在于比较一下&a  和 &c的比较,看看两个是否同一个地址。

如果&a 和&c 不是同一个地址,则c指针指向的地址内容不会发生变化。

在test_pointer函数中,参数是intnode a  而非&a ,说明只是一个形式参数,调用时,是对c对象进行的一次拷贝构造,也就是说,在内存里面重新分配了一个c单元的拷贝。

通过c-》vul 指向的指针对s内存单元地址进行分配。

通过比较以下几个地址

  1. &a  &c  比较一下两者是否同一内存区域

  2. &s  p-》val【注意,是p-》val 而非  &p-》val】  比较。

  3. &s-》data   &p-》val-》data   比较。

通过以上三个地址的比较,我想你应该会有一个明确的答案了。

c语言结构体,指针和函数编程

#include 《stdio.h》
#include 《stdlib.h》
struct student
{
long num;
char name;
int Eng,Math,Comp;
};
void Input( struct student *p, int n);
void Total1( struct student *p, int *psum, float *pave, int n);
void Sort( struct student *p, int *psum, float *pave, int n);
void Print( struct student *p, int *psum, float *pave, int n);
int main()
{
int n;
int *psum;
float *pave;
struct student *p;
scanf("%d",&n);
p=(struct student *) malloc (n*sizeof(struct student));
psum=(int *) malloc (n*sizeof(int));
pave=(float *) malloc (n*sizeof(float));
if (p!=NULL&&psum!=NULL&&pave!=NULL)
{
Input(p,n);
Total1(p,psum,pave,n);
Sort(p,psum,pave,n);
Print(p,psum,pave,n);
}
free(p);
free(psum);
free(pave);
return 0;
}
void Input( struct student *p, int n)
{
int i;
for (i=0;i《n;i++)
{
scanf("%ld%s%d%d%d",&(p+i)-》num,(p+i)-》name,&(p+i)-》Eng,&(p+i)-》Comp,&(p+i)-》Math);
}
}
void Total1( struct student *p, int *psum, float *pave, int n)
{
int i;
for (i=0;i《n;i++)
{
*(psum+i)=(p+i)-》Eng+(p+i)-》Comp+(p+i)-》Math;
*(pave+i)=(*(psum+i))*1.0/3;
}
}
void Sort( struct student *p, int *psum, float *pave, int n)
{
int i,j,k,temp1;
float temp2;
struct student temp3;
for (i=0;i《n;i++)
{
k=i;
for (j=i+1;j《n;j++)
{
if (*(psum+j)》=*(psum+k))
k=j;
}
if (k!=i)
{
temp1=*(psum+i);
*(psum+i)=*(psum+k);
*(psum+k)=temp1;
temp2=*(pave+i);
*(pave+i)=*(pave+k);
*(pave+k)=temp2;
temp3=*(p+i);
*(p+i)=*(p+k);
*(p+k)=temp3;
}
}
}
void Print( struct student *p, int *psum, float *pave, int n)
{
int i;
printf("Pos\tNum\tName\t\tEng\tCom\tMath\tSum\tAver\n");
for (i=0;i《n;i++)
{
printf("%d\t%ld\t%s\t\t%d\t%d\t%d\t%d\t%.0f\n",i+1,(p+i)-》num,(p+i)-》name,(p+i)-》Eng,(p+i)-》Comp,(p+i)-》Math,*(psum+i),*(pave+i));
}
}

结构体指针与结构体变量用作函数参数时有什么区别,在用法上

结构体指针与结构体变量用作函数参数区别:

(1)结构体指针作为函数参数时,调用时传递的是指向一个结构体变量的指针(即结构体变量的地址);结构体变量作为函数参数时,调用时传递的结构体变量本身。

(2)以下代码显示了调用时的区别

#include 《stdio.h》


/* 定义结构体类型Point */

typedef struct {

int x;

int y;

} Point;    


void fun1(Point  point) {

point.x += 10;

point.y += 10;

}


void fun2(Point pPoint) {

pPoint-》x += 10;

pPoint-》y += 10;

}


void main( )

{

Point p;

p.x = 100;

p.y = 200;


/* 调用 fun1 */

fun1( p );

printf("x=%d, y=%d\", p.x, p.y);


/* 调用 fun2:取p的地址作为参数 */

fun2( &p);

printf("x=%d, y=%d\", p.x, p.y);

}

程序的输出为:

x=100, y=200

x=110, y=210

(3)观察上面程序运行的结果发现 fun1函数执行后,p并没发生变化;而调用fun2后,p却改变了。这是因为:调用fun1时,所传递的参数p被复制到调用堆栈中,fun1函数所操作是堆栈中的变量而不是原来的那个变量(main中的p);另一方面,调用fun2时,传入的p的地址,fun2通过地址,修改了main中的变量p。这是结构体指针与结构体变量用作函数参数最大的区别。

一个结构体A,当它的指针作为参数传入函数func,那么在func中可以通过指针改变结构体的值,函数返回后,结构体的值被改变; 但是,当结构体变量作为参数传入函数func时,在func函数中即使对他进行了修改,当函数返回时,结构体本身并没有改变,因为修改的只是他的一个副本。

扩展资料

一、用结构体变量和指向结构体变量的指针构成链表

1、链表是一种常见的重要的数据结构。

2、链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。

二、链表中的每一个元素称为“结点”,每个结点都应包括两个部分:

1、是用户需要用的实际数据,

2、是下一个结点的地址。

三、可以看到链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。

四、可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。

五、可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。

指向结构体的指针作函数参数

很简单.
首先,我们定义一个指针是
类型
*
变量名,比如int
*pInt
=
NULL;
我们定义结构体指针也是一样的,
结构体名
*pStruct(C语言:struct
结构体名
*pStruct,
C++:结构体名
*pStruct,
struct一般可以省略),
比如:
#include
#include
struct
stStudent
{
char
szName;
int
nID;
};
void
Print(stStudent
*pStd)
{
printf("Name:%s\n",
pStd-》szName);
printf("ID:%d\n",
pStd-》nID);
}
void
InitStudent(stStudent
*pStd)
{
strcpy(pStd-》szName,
"CIW");
pStd-》nID
=
14;
}
int
main()
{
stStudent
stStd;
InitStudent(&stStd);
Print(&stStd);
return
0;
}
C语言请加struct.

C 语言结构体为什么可以定义自己的指针,和函数指针 ,而不能定义自己类型的变量呢请教大拿

因为自己类型的变量在这个类型中定义时,是不完整类型,除非你完成定义,不然不会知道这个类型的大小,而且本身嵌套本身,就等于是无穷递归的展开了。
但指针就不同了,C语言的指针大小是4个字节,他只是指向一个地址,和其他的全部无关,他不需要知道自己类型有多大,有怎样的结构什么的,这些都不是他该关心的,他只要指向一个正确的地址就OK了,这就是指针的职责。定义指针是确定,不会影响该类型的结构,也不会出现无穷递归展开,所以在结构体中定义自身指针是合法的。

C语言可以给结构体指针里的函数指针赋函数指针并调用结构体的函数指针吗

  • 可以的。结构体里面可以有各种指针,没有限制。

  • 这要看你所谓的"结构体指针里的函数指针"到底是啥了,如果是一个成员变量,其实和普通函数指针没有任何差别,当然可以使用了,用的方法都没差别

关于C语言结构体指针做函数形参的问题

*s表示变量m本身,对*s的赋值就是对m赋值,所以*s=a是正确的。

请注意,函数fun中的s变量是一个地址,只对该地址进行重新赋值,并不对其所指向的变量m造成影响。所以s=&a不改变main函数中m变量的值。

如果把*s=a,输出会是乱码。这具有很大的迷惑性,使人以为地址的赋值过程出现了问题。实际上,若把m改为全局变量(全局变量中字符串默认为空,int变量默认为0):

#include《stdio.h》
#include《string.h》
#define N 10
typedef struct ss
{
 char num;
 int s;
}STU;
void fun(STU a,STU *s)
{
 int t,p=0;
 t=a.s;
 for(int i=1;i《N;i++)
 {
  if(t》a.s)
  {
   t=a.s;
            p=i;
  }
 }
 s=&a;     //这里是错误的语句
}
STU m;
void main()
{
STU a={
  {"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
  {"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
};
printf("the original data is :\n");
for(int i=0;i《N;i++)
{
  printf("NO=%s MARK=%d\n",a.s);
}
fun(a,&m);
printf("the lowest is %s  who’s score is %d\n",m.num,m.s);
}

输出的将会是the lowest is   who’s score is 0

这说明变量m的值并未改变过。

事实上,若非要使用&符号,正确的方法是使用“引用”:

#include《stdio.h》
#include《string.h》
#define N 10
typedef struct ss
{
char num;
int s;
}STU;
void fun(STU a,STU &s)
{
int t,p=0;
t=a.s;
for(int i=1;i《N;i++)
{
 if(t》a.s)
 {
  t=a.s;
           p=i;
 }
}
s=a;
}
void main()
{
STU a={
  {"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
  {"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
},m;
printf("the original data is :\n");
for(int i=0;i《N;i++)
{
  printf("NO=%s MARK=%d\n",a.s);
}
fun(a,m);
printf("the lowest is %s  who’s score is %d\n",m.num,m.s);
}

 这里&的意思是“引用”,你可以百度上搜索C++中&符号的两个意义。

OK,关于结构体指针和函数和结构体指针和结构体变量在调用函数中的区别的内容到此结束了,希望对大家有所帮助。

结构体指针和函数(结构体指针和结构体变量在调用函数中的区别)

本文编辑:admin

本文相关文章:


win10的java环境变量设置(Win10怎么配置java环境变量 win10配置java环境变量的方法)

win10的java环境变量设置(Win10怎么配置java环境变量 win10配置java环境变量的方法)

本篇文章给大家谈谈win10的java环境变量设置,以及Win10怎么配置java环境变量 win10配置java环境变量的方法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月12日 23:00

oracle存储过程定义变量(请问一下Oracle存储过程中声明变量一定要declare吗)

oracle存储过程定义变量(请问一下Oracle存储过程中声明变量一定要declare吗)

各位老铁们好,相信很多人对oracle存储过程定义变量都不是特别的了解,因此呢,今天就来为大家分享下关于oracle存储过程定义变量以及请问一下Oracle存储过程中声明变量一定要declare吗的问题知识,还望可以帮助大家,解决大家的一些

2026年8月3日 23:20

更多文章:


mariadb忘记密码(mysql用户密码忘记了怎么办)

mariadb忘记密码(mysql用户密码忘记了怎么办)

大家好,mariadb忘记密码相信很多的网友都不是很明白,包括mysql用户密码忘记了怎么办也是一样,不过没有关系,接下来就来为大家分享关于mariadb忘记密码和mysql用户密码忘记了怎么办的一些知识点,大家可以关注收藏,免得下次来找不

2026年10月15日 07:50

mysql端口号(如何查看自己数据库的端口号)

mysql端口号(如何查看自己数据库的端口号)

“mysql端口号”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看mysql端口号(如何查看自己数据库的端口号)!

2026年10月15日 06:30

printf打印16进制(C语言 十六进制怎么输出)

printf打印16进制(C语言 十六进制怎么输出)

大家好,今天小编来为大家解答以下的问题,关于printf打印16进制,C语言 十六进制怎么输出这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 06:00

avantage怎么设置为中文(Avantage安装丢失GIT)

avantage怎么设置为中文(Avantage安装丢失GIT)

大家好,如果您还对avantage怎么设置为中文不太了解,没有关系,今天就由本站为大家分享avantage怎么设置为中文的知识,包括Avantage安装丢失GIT的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月15日 03:00

ospf协议的作用是什么(OSPF路由协议的作用是什么)

ospf协议的作用是什么(OSPF路由协议的作用是什么)

“ospf协议的作用是什么”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看ospf协议的作用是什么(OSPF路由协议的作用是什么)!

2026年10月15日 02:40

方案对比特效js(在一个网页中如何实现两个JS特效)

方案对比特效js(在一个网页中如何实现两个JS特效)

各位老铁们好,相信很多人对方案对比特效js都不是特别的了解,因此呢,今天就来为大家分享下关于方案对比特效js以及在一个网页中如何实现两个JS特效的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月15日 02:10

activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)

activex控件未注册怎么办(登陆视频监控网页时提示activex控件未注册,怎么解决)

今天给各位分享登陆视频监控网页时提示activex控件未注册,怎么解决的知识,其中也会对登陆视频监控网页时提示activex控件未注册,怎么解决进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 20:30

学生信息管理系统c语言(用C语言编程学生信息管理系统!)

学生信息管理系统c语言(用C语言编程学生信息管理系统!)

今天给各位分享用C语言编程学生信息管理系统!的知识,其中也会对用C语言编程学生信息管理系统!进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 20:20

excel连接sql数据库教程(excel怎么连接sql数据库)

excel连接sql数据库教程(excel怎么连接sql数据库)

本篇文章给大家谈谈excel连接sql数据库教程,以及excel怎么连接sql数据库对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月14日 19:40

null s brawl(null和空字符有区别吗)

null s brawl(null和空字符有区别吗)

今天给各位分享null和空字符有区别吗的知识,其中也会对null和空字符有区别吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年10月14日 19:00

最近更新

热刺vs马赛比赛(热刺赛程比分)
2026-10-15 09:10:01 浏览:0
热门文章

标签列表