题目如下:
下面的声明来自某个源文件:
int a[10];
int *b = a;
但在另一个不同的源文件中,却发现了这样的代码:
extern int *a;
extern int b[];
int x ,y ;
......
x=a[3];
y=b[3];
请解释一下:当两条赋值语句执行是会发生什么? 假定整形和指针的长度都是4个字节)。
欢迎大家来发表看法 ^_^ 我觉得是个好题目 所以来和大家分享 我这里有标准答案。
20 个解决方案
#1
这有啥?看你是不是正确链接了文件,如果连接的不正确,那么搞不好就死翘翘了
如果正常链接,那么访问的就都是*(a+3),结果就x==y
如果正常链接,那么访问的就都是*(a+3),结果就x==y
#2
刚才看走眼了,这个不能链接到一开始的那个文件,只能链接到其他的定义a为int*,而且定义b位int[]的文件,否则会报链接错误
#3
*说“楼上的老大麻烦你谦虚点行吗?求你了” ^_^
#4
假定整形和指针的长度都是4个字节)。???这样不行吧!!!???整形4个字节???
#5
好像还是不太对,先放着吧,不过估计和链接符号有关系
#6
试了一下,非法操作了
#7
加油 ^_^
#8
UP
#9
惶惶CSDN 难道没一个能说清楚的吗?
sigh~~~~~~~
sigh~~~~~~~
#10
其实,指针和数组并不完全相同
#11
mark
#12
它们的内存布局不同
如果大家不大明白,我可以一会弄上内存分配图上来
如果大家不大明白,我可以一会弄上内存分配图上来
#13
要使类型相匹配
#14
x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊
呵呵!
y=b[3];//这句肯定有问题啊
呵呵!
#15
比如一个数组是这样
a:
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
那么一个指针应该是
a:
---------
| |
| |
| |
-------
|
指|向
|
|
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
a:
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
那么一个指针应该是
a:
---------
| |
| |
| |
-------
|
指|向
|
|
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
#16
同意幽灵兄的看法
x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊
x就是a[3];
至于y就很不好说了
x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊
x就是a[3];
至于y就很不好说了
#17
楼上错了,我调试了以后发现a指向的地址是0,所以第一句是错误的,而b指向的地址是正确的,的确是原来a的地址。
这个问题应该和指针没什么关系,肯定是extern和全局变量的问题
具体是什么原因引起的,我还要再查一下
这个问题应该和指针没什么关系,肯定是extern和全局变量的问题
具体是什么原因引起的,我还要再查一下
#18
两个都不行...
看来只能数组对数组, 指针对指针
还望楼主解答...
看来只能数组对数组, 指针对指针
还望楼主解答...
#19
答案是:(可能有点JJWW)
在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上
12(3和整形的长度相乘),然后对这个结果执行间接访问超作。但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。
在第2个赋值中,编译器认为b是个数组名,所以它把12(3的调整结果)加到b的存储地址,
然后间接访问超作从那里获得值。事实上,b是个指针变量,所以内存中提取的后面三个字实际上是从另外的任意变量中取得的。
结论:指针和数组虽然有关联,但!!!!绝对不相同。。
有人需要补充的就继续,,晚上我发第2帖^_^
在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上
12(3和整形的长度相乘),然后对这个结果执行间接访问超作。但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。
在第2个赋值中,编译器认为b是个数组名,所以它把12(3的调整结果)加到b的存储地址,
然后间接访问超作从那里获得值。事实上,b是个指针变量,所以内存中提取的后面三个字实际上是从另外的任意变量中取得的。
结论:指针和数组虽然有关联,但!!!!绝对不相同。。
有人需要补充的就继续,,晚上我发第2帖^_^
#20
但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。
为什么不是首地址呢?
为什么不是首地址呢?
#21
#1
这有啥?看你是不是正确链接了文件,如果连接的不正确,那么搞不好就死翘翘了
如果正常链接,那么访问的就都是*(a+3),结果就x==y
如果正常链接,那么访问的就都是*(a+3),结果就x==y
#2
刚才看走眼了,这个不能链接到一开始的那个文件,只能链接到其他的定义a为int*,而且定义b位int[]的文件,否则会报链接错误
#3
*说“楼上的老大麻烦你谦虚点行吗?求你了” ^_^
#4
假定整形和指针的长度都是4个字节)。???这样不行吧!!!???整形4个字节???
#5
好像还是不太对,先放着吧,不过估计和链接符号有关系
#6
试了一下,非法操作了
#7
加油 ^_^
#8
UP
#9
惶惶CSDN 难道没一个能说清楚的吗?
sigh~~~~~~~
sigh~~~~~~~
#10
其实,指针和数组并不完全相同
#11
mark
#12
它们的内存布局不同
如果大家不大明白,我可以一会弄上内存分配图上来
如果大家不大明白,我可以一会弄上内存分配图上来
#13
要使类型相匹配
#14
x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊
呵呵!
y=b[3];//这句肯定有问题啊
呵呵!
#15
比如一个数组是这样
a:
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
那么一个指针应该是
a:
---------
| |
| |
| |
-------
|
指|向
|
|
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
a:
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
那么一个指针应该是
a:
---------
| |
| |
| |
-------
|
指|向
|
|
---------------------------------------------------------------
| | | | | | | | |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
| | | | | | | | |
---------------------------------------------------------------
#16
同意幽灵兄的看法
x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊
x就是a[3];
至于y就很不好说了
x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊
x就是a[3];
至于y就很不好说了
#17
楼上错了,我调试了以后发现a指向的地址是0,所以第一句是错误的,而b指向的地址是正确的,的确是原来a的地址。
这个问题应该和指针没什么关系,肯定是extern和全局变量的问题
具体是什么原因引起的,我还要再查一下
这个问题应该和指针没什么关系,肯定是extern和全局变量的问题
具体是什么原因引起的,我还要再查一下
#18
两个都不行...
看来只能数组对数组, 指针对指针
还望楼主解答...
看来只能数组对数组, 指针对指针
还望楼主解答...
#19
答案是:(可能有点JJWW)
在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上
12(3和整形的长度相乘),然后对这个结果执行间接访问超作。但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。
在第2个赋值中,编译器认为b是个数组名,所以它把12(3的调整结果)加到b的存储地址,
然后间接访问超作从那里获得值。事实上,b是个指针变量,所以内存中提取的后面三个字实际上是从另外的任意变量中取得的。
结论:指针和数组虽然有关联,但!!!!绝对不相同。。
有人需要补充的就继续,,晚上我发第2帖^_^
在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上
12(3和整形的长度相乘),然后对这个结果执行间接访问超作。但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。
在第2个赋值中,编译器认为b是个数组名,所以它把12(3的调整结果)加到b的存储地址,
然后间接访问超作从那里获得值。事实上,b是个指针变量,所以内存中提取的后面三个字实际上是从另外的任意变量中取得的。
结论:指针和数组虽然有关联,但!!!!绝对不相同。。
有人需要补充的就继续,,晚上我发第2帖^_^
#20
但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。
为什么不是首地址呢?
为什么不是首地址呢?