我正在用C语言解决指针和数组的问题
我想我明白,但我想知道我是不是搞砸了
这是最初的问题,我的答案在下面,我的理由是
假设下面声明的变量存储在以下位置。显示作为以下每个语句的结果存储的值。假设每个语句都使用前面语句存储的值。

int *p, *q, *r;
int a = 10; b = 25;
int c[4] = {6,12,18,24};


address      variables
5000         p
5004         q
5008         r
500C         a
5010         b
5014        c[0]
5018        c[1]
501C        c[2]
5020        c[3]

1. p = c;
2. q = &a;
3. r = p + 2;
4. c[1] = *p;
5. c[2] = *(p + 2);
6. c[3] = *p + 2;
7. *r = *q;
8. r = q;
9. p = &c[0];
10. p++;

我的答案
1.5014,因为p是一个指针,所以它指向c,c指向c[0]的地址,即5014
2.500c,因为q设置为指向a的地址
3.5016,因为p现在是5014,5014+2=5016(我不确定这意味着什么,因为5016不在地址列表中)
4.6,p指向地址c[0],该元素为6
5.5016,我不知道它是怎么工作的,你可以加上5014+2=5016,但根据地址,这并没有指向任何地方
6.8,p指向地址c[0],其中存储6,6+2=8
7.500c,r设置为指向a地址的q点
8.10,q指向a,a是10(我不明白这个和7的区别,也许答案应该颠倒)
9页)。5014,p设置为5[0]的地址
10.5015,p递增
有人知道我是不是搞砸了吗?

最佳答案

希望这个:Pointer Arithmetic;能帮助你。
指针算法不同于通常的算法。当我们向指针添加一个值时,该值将在被添加之前乘以数据类型(指针指向的数据类型)的大小!
所以,我们有:
三。。r = p + 2
变成:r = 5014 + 2 * sizeof(int) = 501C
5。。c[2]=*(p+2);
变成:c[2] = *(5014 + 2 * sizeof(int))=>*(501C)=>18
7。。*r = *q
现在r指向c[2]并且q指向a,所以
*r = *q表示c[2] = a=>10
8。。r = q
有了这个,r现在指向c[2]
10。。a
p++增加一个,因此pp变为5018

关于c - C指针和数组问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23126211/

10-11 19:43