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

《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和指针》中一道题的疑惑原题...的网友还看了以下:

某校网络班计划将全班同学分成若干小组开展数学探究活动.如果每个小组3人,则还剩10人,如果每个小组  2020-05-22 …

某校七年级一般计划将全班同学分成若干组开展数学探究活动,如果每组3人,还余10人;如果每组5人,则  2020-05-22 …

请仔细观看下图请回答:①这是哪个国际组织的旗帜?该组织成立于哪年?创始国有几个?(3分)②该组织的  2020-06-16 …

该组织是欧洲区域一体化组织教材中给出该成员国数字是25个2007年1月1日起罗马尼亚和保加利亚正式  2020-06-22 …

英语书面表达SecondChanceFarm是一个收留流浪猫狗和其他小动物的志愿者组织。该组织想招  2020-06-30 …

如图是某国际组织的会旗,根据下面对该组织的描述,请判断其应该是()①该组织是最具普遍性、代表性和权  2020-07-06 …

在一次数学测验中,高一(1)班第2小组所有同学的成绩组成一个数列{an},且前n项的和Sn=n2+  2020-07-08 …

在绘制直方图时,分组组数和数据个数之间有一个经验对应关系.当数据个数为50~100时,分组组数一般  2020-07-29 …

下列说法中,正确的个数有()①一组数据的平均数一定是该组数据中的某个数据;②一组数据的中位数一定是  2020-08-01 …

有一个包含了n个字符的字符串.编写一个函数,将此字符串从头开始共m个字符作为一个子字符串复制到另一个  2020-11-07 …