永发信息网

C语言中整形数组的首地址的地址?

答案:4  悬赏:40  手机版
解决时间 2021-03-07 20:34
  • 提问者网友:浮克旳回音
  • 2021-03-07 09:22
比如 int a[3] = {2,3,4};
为什么 printf("%d,,%d\n",a,&a); 输出的是同一个值?难道首地址和首地址的地址相同吗?
最佳答案
  • 五星知识达人网友:野味小生
  • 2021-03-07 10:38
其实你这个疑问是概念上的混淆,或者说对指针了解上上的欠缺

首先讲int a[3] = {2,3,4};
这里的a是这个数组的首地址,比如定义如:int *p = a;这时如果你进行如下操作:
p++;
printf("%d\n",*p);
结果会是输出2,也就是说p+1相当于数组索引加1,但是像你所问的为什么&a和a是相同的 ,首先要知道他们分别代表什么意思,a:像上面所说的是数组的首地址,做自加运算会根据数组类型来计算偏移量,那么&a是什么东西呢,实际上它也是一个指针,是指向一个具有3个元素的数组的指针,如何理解,看以下定义:

如果你定义int *q = &a;这时编译器肯定报错,绘制出数据类型不一致,那么你这样样定义就没有问题:int (*q)[3] = &a;这时如果你再对q进行++操作,那么加的就不同了,如相面的p++操作后p的值会加4,而这里q++操作后的值会加12,也就是跳过3个数组元素,然而,确实这两个指针的初始值是一样的,只是类型不一样而已,这对二维数组的访问时很方便的,这个你可以参照2维数组得到进一步理解,讲的有点乱,不知道你能不能理解
全部回答
  • 1楼网友:掌灯师
  • 2021-03-07 13:17
不是的。但对于数组来说,数组名存的就是数组的首地址,所以你这样输出的两个才会是相同的。
  • 2楼网友:渡鹤影
  • 2021-03-07 12:25
%p 直接用16进制地址形式输出地址 %d 把地址直接用10进制形式输出 char a[] = "hellow c++"; int b[] = {0x01,0x02,4,0x08,0}; 如上数组如下输出都可以: printf("十进制地址%d 十六进制地址%p", a, a); printf("十进制地址%d 十六进制地址%p", b, b); printf("十进制地址%d 十六进制地址%p", &a[0], &a[0]); printf("十进制地址%d 十六进制地址%p", &b[0], &b[0]);
  • 3楼网友:举杯邀酒敬孤独
  • 2021-03-07 12:00
一个数组的数组名就代表了这个数组在存储器中存储的首地址。 汇编中: MOV DPTR,#TABLE TABLE: 20H,30H,40 MOV DPTR,#TABLE ;这里就是把定义的数组TABLE当作立即数赋给寄存器DPTR
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯