我在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 [0]的地址,即5014
2.500c因为q设置为指向地址
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设置为指向q,指向一个地址
8.10,q指向a为10(我不明白与这个和#7的区别,也许答案应该颠倒)
9)。 5014,p设置为5 [0]的地址
10.5015,p递增
有人可以告诉我是不是搞砸了?
答案 0 :(得分:3)
希望如此:Pointer Arithmetic;会帮助你。
指针算法与通常算法不同。当我们向指针添加一个值时,该值会在添加之前乘以数据类型的大小(指针指向的数据类型)!
所以,我们有:
3 .. 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
的{{1}}现指向c[2]
。
10 .. a
p++
增加p
,p
从[{1}}变为5018
答案 1 :(得分:0)
你是正确的第7和第8个他们应该被逆转。 在第7步中,您将取消引用指针,因此位于q的地址的值将被放置在r所持有的地址中。
对于第10步,增量指针将根据它是指针的数据类型的大小而增加。例如,如果它的int将增加2个字节或4个字节,具体取决于编译器。 同样适用于第3步。
除此之外一切看起来都不错。
答案 2 :(得分:0)
3.5016因为p现在是5014,5014 + 2 = 5016(我不确定这是什么意思,因为5016不在地址列表中)
This is 5008 as incr on pointer increments the address. // note you are not using *p
5.5016,我不知道这是怎么回事,你会加5014 + 2 = 5016但是根据地址没有指向任何地方
This points to value at address 5008
7.500c,r设置为指向q,指向一个地址
value of a (10) will be stored at adrress 5008
8.10,q指向a为10(我不明白与这个和#7的差异,也许答案应该颠倒)
r will point to 5004
10.5015,p递增
p will be incremented by 4 (consider size of int is 4). i.e p will point to c[1]