结构体指针做形参,实参可用结构体数组访问??

老马他舅舅 2018-08-23 12:28:09
结构体指针做形参,在函数内部可用temp->a=1赋值,为什么还能用temp[0].a=1 temp[1].a=2 temp[2].a=3进行赋值??
并且 (temp+0)->a==temp[0].a (temp+1)->a==temp[1].a (temp+2)->a==temp[2].a
(temp+0)->a==temp[0].a的地址相同可以理解为什么可以赋值。可是为什么感觉传进来的结构体指针变成了一个结构体数组?

#include <stdio.h>
typedef struct ex
{
int a;
int b;
}ex,*p_ex;

void fun(p_ex temp);
ex msg;
int main()
{
msg.a=2;
printf("befor msg.a=%d\n",msg.a); //msg.a的值
printf("&(msg.a)=%p\n",&(msg.a)); //msg.a的地址

fun(&msg); //经过函数处理 msg.a的值被函数中的temp[0].a=3;改变

printf("after msg.a=%d\n",msg.a); // 为什么msg.a会被temp[0].a改变呢?可能是他们的地址是一样的

//可是为什么temp[1].a temp[2].a 可以被赋值,又应该怎么用temp来访问??
putchar('\n');
return 0;
}
void fun(p_ex temp)
{
printf("-------------对应值---------------\n");
temp->a=1;
printf("temp->a=%d\n",temp->a);

temp[0].a=3;
printf("temp[0].a=%d\n",temp[0].a);

temp[1].a=4;
printf("temp[1].a=%d\n",temp[1].a);

temp[2].a=5;
printf("temp[2].a=%d\n",temp[2].a);

temp[0].b=6;
printf("temp[0].b=%d\n",temp[0].b);

temp[1].b=7;
printf("temp[1].b=%d\n",temp[1].b);

temp[2].b=8;
printf("temp[2].b=%d\n",temp[2].b);
printf("-------------对应地址---------------\n");

printf("&(temp->a)=%p\n",&(temp->a));
printf("&(temp->b)=%p\n",&(temp->b));
printf("&(temp[0].a)=%p\n",&(temp[0].a));
printf("&(temp[0].b)=%p\n",&(temp[0].b));
printf("&(temp[1].a)=%p\n",&(temp[1].a));
printf("&(temp[1].b)=%p\n",&(temp[1].b));
printf("&(temp[2].a)=%p\n",&(temp[2].a));
printf("&(temp[2].b)=%p\n\n",&(temp[2].b));
}



运算结果:
...全文
515 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangchm2018 2018-08-25
  • 打赏
  • 举报
回复
引用 9 楼 qq_34991245 的回复:
[quote=引用 1 楼 wang0635 的回复:]
以数组形式出现的形参,实际上就是指针。写成数组形式只是为了好看。真正的数组自己是无法作为参数用的

这里的确是可以用指针访问,但是在访问超过temp[0].a的时候,并没有对其他的temp[i].a赋值,如果temp[i].a的地址刚好被其他数据占用,就会发生一些意想不到的错误。[/quote]

没有对 temp[i].a 赋值,因为系统并没有给该程序分配这块内存,所以当你赋值后,该值仍然不确定,因为有可能这块内存的值被其他程序改变过,也有可能这块程序未被其他程序改变,像你的结果一样。

因为 C 语言对指针不做限制,所以能利用指针访问到未分配的内存,如果这块内存已经被占用,就会发生冲突。
老马他舅舅 2018-08-25
  • 打赏
  • 举报
回复
引用 1 楼 wang0635 的回复:
以数组形式出现的形参,实际上就是指针。写成数组形式只是为了好看。真正的数组自己是无法作为参数用的

这里的确是可以用指针访问,但是在访问超过temp[0].a的时候,并没有对其他的temp[i].a赋值,如果temp[i].a的地址刚好被其他数据占用,就会发生一些意想不到的错误。
老马他舅舅 2018-08-25
  • 打赏
  • 举报
回复
这里的确是可以用指针访问,但是在访问超过temp[0].a的时候,并没有对其他的temp[i].a赋值,如果temp[i].a的地址刚好被其他数据占用,就会发生一些意想不到的错误。
半雨微凉丶 2018-08-24
  • 打赏
  • 举报
回复
数组确实可以作为参数,传递是指针
不过楼主想问的估计是为什么结构体能用下表访问
kuake56 2018-08-23
  • 打赏
  • 举报
回复
指针可以作为数组
赵4老师 2018-08-23
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵4老师 2018-08-23
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
wang0635 2018-08-23
  • 打赏
  • 举报
回复
以数组形式出现的形参,实际上就是指针。写成数组形式只是为了好看。真正的数组自己是无法作为参数用的
只此冒泡君 2018-08-23
  • 打赏
  • 举报
回复
你传递进去的是指针 了解一下 形参 值传递 和 指针传递吧
zhangchm2018 2018-08-23
  • 打赏
  • 举报
回复
形参是:
①数组名,传递的是地址
②指针, 传递的是地址
所以,传递的都是相同的东西,只是表达方式不同。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧