早教吧 育儿知识 作业答案 考试题库 百科 知识分享

《c和指针》中一道题的疑惑原题如下“下面的声明取自某个源文件:inta[10];//在该源文件中定义数组;int*b=a;//在该源文件中定义指针b,且让其指向数组a的首地址。但在另一个不同的

题目详情
《c和指针》中一道题的疑惑
原题如下
“ 下面的声明取自某个源文件:
int a[10]; // 在该源文件中定义数组;
int *b = a; // 在该源文件中定义指针b,且让其指向数组a的首地址。
但在另一个不同的源文件中,却发现了这样的代码:
extern int *a; // 声明指针a全局化,即为上个源文件的a[];
extern int b[];// 声明指针b[]全局化,即为上个源文件的b;
int x, y; // 假设a处的地址为1234.
...
x = a[3];// x等于地址为1234+12处的存储值;
y = b[3];//y等于地址为1234+12处的存储值。
请解释一下,当两条赋值语句执行时会发生什么?(假定整形和指针长度都是4个字节。”
上面//后的解释是我自己加上的,请问上面解释有问题吗?如果没有问题,则x和y应该是一样的啊,为什么该题的解释是不一样的,说了很长一段,但最后还是不知所云。原来的该题解释如下:
“在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的的指针值,并加上12,(3和整形的长度相乘),然后对这个结果执行间接访问操作。但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素,它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致的程序失败。
在第二个赋值中,编译器认为b是个数组名,所以它吧12(3的调整结果)加到b的存储地址,然后间接访问操作从哪里获得值。事实上,b是个指针变量,所以从内存中提取的后面三个字实际上是从另外的任意变量中取得。这个问题说明了指针和数组虽然存在关联,但绝对不是相同的。”
▼优质解答
答案和解析
解释很深刻,受教了
你多看几遍就明白了,这个没法再解释了
看了《c和指针》中一道题的疑惑原题...的网友还看了以下:

C++中this的选择题下列说法正确的是??A.this指针存在于每个函数之中B.在类的非静态函数  2020-05-13 …

swatch超薄三针手表.记时指针不归零我景天刚在专柜换的电池,装上后三个小针自动转了一圈后就不在  2020-05-16 …

指南针是我国古代四大发明之一,关于指南针,下列说法中正确的是()A.指南针可以仅具有一个磁极B.指  2020-06-16 …

10.使用Flash软件制作按钮元件时,编辑元件时有弹起,指针经过,按下,点击四个,其中按下指的是  2020-06-29 …

请找两根缝衣针、一个按扣、一只大头针和一块橡皮,做一个指南针.用橡皮和大头针制作指南针的底座.使缝  2020-07-08 …

指南针是我国古代四大发明之一.关于指南针,下列说明正确的是()A.指南针可以仅具有一个磁极B.指南  2020-07-10 …

楠同学在做数学作业前观察到钟的分针和时针都指在7与8之间······小红做作业前看了一下时钟,时、  2020-07-15 …

c语言关于指针的选择题急急急下列说法中错误的是得分/总分A.指针指向数组元素时,指针算术运算才是有  2020-08-03 …

计算机公共基础问题请问下大家,已知栈(或者队列)的容量,指针头、指针尾的位置,求栈(队列)中元素的个  2020-11-14 …

如图,一个水平放置的正方形ABCD的中心O有一根能自由转动的指针.现自由转动指针,停止时记下指针所指  2020-12-31 …