讨论贴————指针方面(每天一贴)

时间:2022-05-31 19:53:19

题目如下: 

下面的声明来自某个源文件:
  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

#2


刚才看走眼了,这个不能链接到一开始的那个文件,只能链接到其他的定义a为int*,而且定义b位int[]的文件,否则会报链接错误

#3


*说“楼上的老大麻烦你谦虚点行吗?求你了” ^_^

#4


假定整形和指针的长度都是4个字节)。???这样不行吧!!!???整形4个字节???

#5


好像还是不太对,先放着吧,不过估计和链接符号有关系

#6


试了一下,非法操作了

#7


加油 ^_^

#8


UP

#9


惶惶CSDN 难道没一个能说清楚的吗?
sigh~~~~~~~

#10


其实,指针和数组并不完全相同

#11


mark

#12


它们的内存布局不同
如果大家不大明白,我可以一会弄上内存分配图上来

#13


要使类型相匹配

#14


x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊

呵呵!

#15


比如一个数组是这样
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就很不好说了

#17


楼上错了,我调试了以后发现a指向的地址是0,所以第一句是错误的,而b指向的地址是正确的,的确是原来a的地址。

这个问题应该和指针没什么关系,肯定是extern和全局变量的问题

具体是什么原因引起的,我还要再查一下

#18


两个都不行...
看来只能数组对数组, 指针对指针

还望楼主解答...

#19


答案是:(可能有点JJWW)

在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上
12(3和整形的长度相乘),然后对这个结果执行间接访问超作。但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。

在第2个赋值中,编译器认为b是个数组名,所以它把12(3的调整结果)加到b的存储地址,
然后间接访问超作从那里获得值。事实上,b是个指针变量,所以内存中提取的后面三个字实际上是从另外的任意变量中取得的。

结论:指针和数组虽然有关联,但!!!!绝对不相同。。


有人需要补充的就继续,,晚上我发第2帖^_^

#20


但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。

为什么不是首地址呢?

#1


这有啥?看你是不是正确链接了文件,如果连接的不正确,那么搞不好就死翘翘了

如果正常链接,那么访问的就都是*(a+3),结果就x==y

#2


刚才看走眼了,这个不能链接到一开始的那个文件,只能链接到其他的定义a为int*,而且定义b位int[]的文件,否则会报链接错误

#3


*说“楼上的老大麻烦你谦虚点行吗?求你了” ^_^

#4


假定整形和指针的长度都是4个字节)。???这样不行吧!!!???整形4个字节???

#5


好像还是不太对,先放着吧,不过估计和链接符号有关系

#6


试了一下,非法操作了

#7


加油 ^_^

#8


UP

#9


惶惶CSDN 难道没一个能说清楚的吗?
sigh~~~~~~~

#10


其实,指针和数组并不完全相同

#11


mark

#12


它们的内存布局不同
如果大家不大明白,我可以一会弄上内存分配图上来

#13


要使类型相匹配

#14


x=a[3];//这句应该没问题
y=b[3];//这句肯定有问题啊

呵呵!

#15


比如一个数组是这样
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就很不好说了

#17


楼上错了,我调试了以后发现a指向的地址是0,所以第一句是错误的,而b指向的地址是正确的,的确是原来a的地址。

这个问题应该和指针没什么关系,肯定是extern和全局变量的问题

具体是什么原因引起的,我还要再查一下

#18


两个都不行...
看来只能数组对数组, 指针对指针

还望楼主解答...

#19


答案是:(可能有点JJWW)

在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上
12(3和整形的长度相乘),然后对这个结果执行间接访问超作。但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。

在第2个赋值中,编译器认为b是个数组名,所以它把12(3的调整结果)加到b的存储地址,
然后间接访问超作从那里获得值。事实上,b是个指针变量,所以内存中提取的后面三个字实际上是从另外的任意变量中取得的。

结论:指针和数组虽然有关联,但!!!!绝对不相同。。


有人需要补充的就继续,,晚上我发第2帖^_^

#20


但a实际上是整形数组的起始位置,所以作为”指针“获得的这个值实际上是数组的第一个整形元素。

为什么不是首地址呢?

#21