C 语言关于结构体做参数传递
双指针
C语言结构体传参

小-黯
原创
关注
7点赞·2315人阅读
目录
C语言结构体传参
1. 普通传参
1.1 测试代码
1.2 测试结果
1.3 结果分析
2. 单指针传参
2.1 修改结构体数据
2.1.1 测试代码
2.1.2 测试结果
2.1.3 结果分析
2.2 修改结构体地址
2.2.1 测试代码
2.2.2 测试结果
2.2.3 结果分析
3. 双指针传参
3.1 测试代码
3.2 测试结果
3.2 结果分析
C语言结构体传参
结构体传参包括三种传参方式
普通传参:函数接收到结构体参数后,会复制一份原来的结构体作为形参供函数使用,而函数内的任何操作都是对拷贝结构体的修改,不会影响到原本的结构体变化。
单指针传参:函数接收的是一个结构体的地址,该指针指向的是结构体起始地址,也就相当于传入了结构体内所有变量的地址,函数接收到该结构体指针后,我们就可以根据地址访问结构体中每个变量的真实数据,在函数内对结构体内数据的操作,都会影响到原本结构体内数据的变化
双指针传参:函数接收的是结构体指针变量的地址,因为一级指针代表的是结构体的地址,在函数中能够操作结构体内的数据,则二级指针指向的是结构体的地址,则同理我们可以根据二级指针访问修改结构体的地址
即通过一级指针,对结构体内数据的操作会影响到原本结构体内数据的变化
而通过二级指针,对结构体地址的操作会影响到原本结构体地址的变化,例如为结构体分配空间
结构体作为函数参数的引用问题
为什么动不动就什么“请举例并以汇编代码详细说明”,像我这样不太需要分数的,一点吸引力都没。好忙,自己努力一点,别上来就代码呀,举例呀,之类的。大家都要努力点才好。
关于参数传递,一个是传递结构体的指针,一个是传递结构体指针的指针,即双重指针。
任何东西,当需要在函数内修改,并且返回的时候,就用它的指针。比如一个int
a,当函数只用它,传a就好了。如果要改他,那么就要传&a,因为实参在函数退出时会销毁。
那么,结构体参数传递也是一个道理。传结构体指针,说明你要用结构体的数据,或者更改结构体变量。如果传双重指针,那么可能意味着这个参数还是个返回值,也许结构体本身并不存在,由函数区创建一个结构体,或者存在,但是函数要改变指针的指向。
呵呵,看到你的第二个问题,就更加说明我的理解对了。所以只有而重指针被分配空间,函数回去分配结构体的实际空间。这个二重指针是参数返回的一种方式,很常用。
C语言中,结构体作为函数参数传递,详解
1.可以把结构体作为参数啊,
2.不去取地址的意思,是引用的意思,函数执行时修改L的值,就直接的修改了实参的值,相当于地址传递了。
3.真正调用的时,如下:
SqList
tempStruct;
InitList_Sq(tempStruct)
这样就可以了。
呵呵
怎么用结构体变量做函数参数
结构体要定义在头文件中, 最起码也该定义在main函数的外面, 你的写法太老式了.
struct s{
int fanghao;
}a;
void luru(int i,struct s a){
// 在你的函数定义之前, s必须是已经定义的, 可见的, 要放在函数前面
}
int main(){
// main 函数
}
关于c语言中的结构体数组作为函数参数传递的
1、结构体数组传给指针,实质上是不可能的,本质上传的是数组首地址,根据偏移来操作数组,这样看起来好像是真在操作数组一样。就和普通指针一样使用,只不过它是结构体数组。
2、例程:
typedef struct Student
{
char name ;
int age ;
}Student;
#define LEN 10
//print all Student infomation
void fun(Student *pStu,int len)
{
int i ;
for(i = 0 ;i 《 len ;++i)
{
printf(“%s\t%d“,pStu.age) ;
}
}
int main ()
{
Student stu ;
fun(stu,LEN) ;
}
结构体指针与结构体变量用作函数参数时有什么区别,在用法上
结构体指针与结构体变量用作函数参数区别:
(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、是下一个结点的地址。
三、可以看到链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。
四、可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。
五、可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。
结构体作为函数参数值传递的问题
传结构体地址与传结构体指针二者都可以作为传出参数,因为接受函数必须为其定义一个结构指针来接收,这样在函数内就可以修改结构体,在这点上二者没有区别。
定义结构体指针未分配地址空间就作为参数传递会,如果你想把它作为传出参数的话,
你必须这么写;
void
get(struct
student
**p);
//用p来接收
main()
{
struct
student
*a;
get(&a);
}
这样你也能得到你想要的结果。当然你需要在get()函数中用malloc()为其
动态分配内存空间。
你是想知道接收函数的结构体是如何分配的吗?
在接收函数中理论上他会在它自己的函数栈帧复制一份实参结构体拷贝,如果你传的是结构体本身!
这样你对结构体的修改不会对实参有影响。
把一个结构体作为函数参数,此参数声明为什么类型呢
自然是声明为该结构体类型了
比如定义一个结构体如下:
struct structA
{
};
则该结构体作为函数参数时,使用struct structA paramName声明该结构体参数,其中paramName为参数名。
若声明的结构体如下:
typedef struct structA
{
}STRUCTA;
则作为函数参数时,可以直接使用STRUCTA paramName声明该结构体参数,其中paramName为参数名。
结构体数组怎么做函数参数
括号中加入STUDENT gh
首先要在主函数前定义void Label(STUDENT *)但在STUDENT 定义之后
引用时Label(student) student本身就是地址 这是数组和结构体的性质
此时引用的是首地址,可在引用后对地址进行j=0循环加1到下一个结构体进行操作,如gh
结构体变量作为函数参数有几种传递方式详细说明各自的优缺点
在C中结构体变量作为函数参数只有一种传递方式:值拷贝!主要缺点是传递时耗长,且函数中对结构体的操作结果一般是带不到主调函数中的;用结构体指针传递可以避免这些缺点,但那就不是“结构体变量”作为函数参数而“结构体指针”作为函数参数了。指针传递的缺点是容易把初学者搞糊涂,几乎无其他缺点。C++中用引用传递,真是吸纳了上述两种方式的各自优点而规避了其缺点。