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

 我来答
gaiement
2019-06-28 · TA获得超过8778个赞
知道答主
回答量:34
采纳率:0%
帮助的人:2.4万
展开全部

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

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

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

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

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

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

光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
freeeeeewind
推荐于2017-09-06 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1323万
展开全部

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

(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。这是结构体指针与结构体变量用作函数参数最大的区别!!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
北丐0501
推荐于2017-09-19 · TA获得超过118个赞
知道答主
回答量:29
采纳率:0%
帮助的人:33.7万
展开全部
这两者作为函数参数,还是有很大的区别的,我说说自己的理解。
如:
typedef struct A{int a;...}A; //定义结构体A
void Func(A a); //通过结构体变量传参
void Func(A* pA); //通过结构体指针传参

调用函数时,因为函数参数要临时存放到栈中,若结构体变量作为参数,则需要生成一个结构体A的副本,将其存放到栈中; 而结构体指针作为变量,只需将指针pA存放到栈中即可,提高了程序的空间效率。

其次,结构体指针作为函数参数: 可以在函数中通过该指针引用结构体,当在函数中修改了结构体的成员变量后(如:pA->a = 0),指针pA所指向的结构体本身也被改变了。
不同的是,当结构体变量作为函数参数: 在函数中可通过变量直接使用结构体,但要注意的是,如果在函数中修改了结构体的成员变量后(如: a.a = 0),结构体本身并未发生变化,只是副本被改变。
追问
你后面说的结构体本身也被改变  是什么意思
追答
这样说是为了便于对比指针和变量作为参数的不同点,可能描述有些不太准确了。

其实我想说的是这个意思:
一个结构体A,当它的指针作为参数传入函数func,那么在func中可以通过指针改变结构体的值,函数返回后,结构体的值被改变; 但是,当结构体变量作为参数传入函数func时,在func函数中即使对他进行了修改,当函数返回时,结构体本身并没有改变,因为修改的只是他的一个副本。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
闾丘素芹支辰
2019-10-09 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.3万
采纳率:34%
帮助的人:838万
展开全部
你的理解是对的。
形参是结构体变量的,你对该结构体的所有修改都不会影响到实参,因为形参是实参的一个完整拷贝。
形参是结构体指针的,你对该结构体的修改直接影响实参的结构体数据。因为形参和实参都指向同一个内存区块。注意:形参是一个指针,如果只改变指针本身,则不影响实参。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式