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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体指针与结构体变量用作函数参数时有啥区别,在用法上相关的知识,希望对你有一定的参考价值。

参考技术A

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

(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、是下一个结点的地址。

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

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

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

参考资料来源:百度百科-结构体类型

结构体数组怎么做函数参数

定义了一个结构体数组STUDENT student[200]; 如何用作函数参数如:void Label();函数里面要对数组的元素student[i].元素做操作 怎么实现 小白求高手详解

括号中加入STUDENT gh[]
首先要在主函数前定义void Label(STUDENT *[])但在STUDENT 定义之后
引用时Label(student) student本身就是地址 这是数组和结构体的性质
此时引用的是首地址,可在引用后对地址进行j=0循环加1到下一个结构体进行操作,如gh[j]追问

void Label(STUDENT *[]) *后面直接加[]么?还有就是我需要的是之前student[i].元素已经在一个for循环体内,并且每一次循环的i已经固定 怎么操作啊

追答

再定义一个变量,两个不影响

追问

我的意思是for(i;i<num,i++) .... void Label() .... void Label()中的i要与for循环的一致,不需要全部的怎么实现啊? 另外STUDENT *[] *[]这个是什么意思 呢 可以直接用么

追答

那就在自定义函数中不用自变量i,在调用时给地址加1就可以了直接进行操作

参考技术A 以C/C++为例,数组作为函数参数会转化为指针,结构体数组也不例外,会转化为指向该结构体类型的指针。
比如
struct A;
void foo(struct A*);
A a[10];
foo(a); //正确

以上是关于结构体指针与结构体变量用作函数参数时有啥区别,在用法上的主要内容,如果未能解决你的问题,请参考以下文章

C语言,请问linkstack *s与 lintstack (s)有啥区别

结构体作为函数参数值传递的问题

结构体与共用体

结构体数组怎么做函数参数

c语言中,函数的形参啥时候必须是指针

C 语言结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )