关于数组与指针的问题

名人堂再聚首 2015-09-18 04:19:35
我在读《C和指针》这本书时,讲到数组那章有一个练习题是这样的:
有一个数组定义如下:

int array[20]={
10,20,30,40,50,60,70,80,90,100,
110,120,130,140,150,160,170,180,190,200
};

现在假定array数组在内存中的起始位置是100,整型值和指针的长度都是4个字节,求&array+4的结果,它的答案是116(没有说明理由)。
但是我觉得应该是420(如果内存空间允许的话),理由是&array是表示数组本身的地址,实际为一个指向包含20个int型元素的数组的指针,也就是数组指针,对该指针进行数字的加减操作,每次的增量应该是它所指向数组的全部元素所占用的空间大小,这个指针实际指向的数组有20个元素,每个元素占用4个字节,数组指针每加1就相当于移动80个字节,这里加上4,最后结果应该就是420,不知道我的理解有没有问题,望大家指正。
...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
均陵鼠侠 2015-09-19
  • 打赏
  • 举报
回复
这么简单的问题,居然也七嘴八舌,莫衷一是,真是奇观。 首先,指针运算的意义在于,如果指针P指向数组的第n个元素,则P + e的结果也是指针,指向数组的第n + e个元素。 显然,指针& array和& array + 4间隔4个元素。 关键是这两个指针所指向的元素类型。& array是指向数组的指针 int (*) [20]。这意味着,这两个指针所指向的位置间隔4个数组的大小。 已知 sizeof (int) == 4,则每个数组80个字节,共4个数组,一共是320个字节。 100 + 320 = 420。 完毕。 问:以下两行,将第一行的两个输出相减,应该等于第二行的输出,不是吗?
printf ("%p, %p\n", & array, & array + 4);
printf ("%d\n", (& array + 4) - & array);
答:它们肯定不同。第一行是分别输出两个指针的地址,相减后是两个地址之间相差的字节数,和数组元素的类型有关;第二行是两个指针相减,得到的是它们间隔的数组元素数量,和元素的类型无关。
H_Clong 2015-09-19
  • 打赏
  • 举报
回复
对的!作者估计以为是指针,移动一次加4!但是内存地址是16进制啊!题目没表达清楚,也没算对!
qq_30239507 2015-09-18
  • 打赏
  • 举报
回复
事实证明你是对的。
lm_whales 2015-09-18
  • 打赏
  • 举报
回复
另外,代码也是有地址的, 这就是C,C++中函数地址的概念 至于,成员指针,是成员变量,成员函数,指针这些概念的结合 分为 指向数据成员的 成员指针 和指向成员函数的 成员函数指针 成员指针,是对指针的一种抽象模拟,其实不太象C的指针。
lm_whales 2015-09-18
  • 打赏
  • 举报
回复
数组的地址,和数组的首地址之间的区别,是类型的区别。 本质上指的是同一位置 类型,和指针的关系,是高级语言才有的、 对于汇编语言, 一个指令,有两类地址寄存器, 以及 内存地址 其中内存地址,是和指针相关的: 一般内存地址分成两个部分(有些CPU更多) ----- 段, (实模式:段地址,保护模式 :选择子,描述符) 和 偏移量 的数字值----- 才是看得见了。 高级语言(带指针类型的) 中 指针的类型,主要指的是地址所示的,内存中的数据的类型。 指针变量的类型 是 1)指向某种类型数据的 2)指针 这两回事的结合。 所以,看待指针这样的东西,不能仅仅看书上,甚至与标准上怎么说。 要看它实际是怎么回事。 然后,结合书上,或者标准中的描述,就很好懂了
qq_30446977 2015-09-18
  • 打赏
  • 举报
回复
我简单的实际运行了下,和我预想的差不多,你的想法不对。你可以实际编个程序,运行对比一下。
qq_30446977 2015-09-18
  • 打赏
  • 举报
回复
我觉得书上是对的。 因为你推理出来的,都是基于一个事实, “理由是&array是表示数组本身的地址,实际为一个指向包含20个int型元素的数组的指针,也就是数组指针,对该指针进行数字的加减操作” 你推理的第一步是这个,但是地址是地址,指针是指针。&表示的是地址,结果数值是和指针数值是一样,但是不是一样的概念。所以你第一步推理错误,后面的都错了。 我是这么觉得的。
fastkb 2015-09-18
  • 打赏
  • 举报
回复
我觉得还应该迷信C语言的标准 比如C99这些东西。
fly_dragon_fly 2015-09-18
  • 打赏
  • 举报
回复
你的理解是对的,相差320, 书上错的
赵4老师 2015-09-18
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
#include <stdio.h>
int array[20]={
    10,20,30,40,50,60,70,80,90,100,
    110,120,130,140,150,160,170,180,190,200
};
int main() {
    printf("0x%p,0x%p\n",&array[0],&array+4);//0x00403010,0x00403150
    return 0;
}

69,373

社区成员

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

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