C指针和数组问题

时间:2014-04-17 06:38:41

标签: c arrays pointers

我在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递增

有人可以告诉我是不是搞砸了?

3 个答案:

答案 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++增加pp从[{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]