【问题标题】:C pointers and arrays problemsC 指针和数组问题
【发布时间】:2014-04-17 06:38:40
【问题描述】:

我正在解决 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 被设置为指向 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 设置为指向 q 指向 a 的地址

8.10 , q 指向的 a 是 10(我不明白这个和 #7 的区别,也许答案应该颠倒过来)

9)。 5014,p设置5[0]的地址

10.5015,p 递增

谁能告诉我是不是搞砸了?

【问题讨论】:

  • 首先,您可以运行它并自己查看。
  • 记住p+1根据p的数据类型增加指向下一个地址的指针..在int的情况下它增加4
  • @GoldRoger 正确,如果 sizeof(int) == 4,根据定义它不是真的(但在大多数平台上当然是真的)。​​

标签: c arrays pointers


【解决方案1】:

希望这个: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

有了这个,指向c[2]r现在指向a

10..p++

p 增加一,因此p5014 变为5018

【讨论】:

    【解决方案2】:

    你是对的,关于第 7 和第 8,它们应该颠倒过来。 在第 7 步中,您将取消引用指针,因此位于 q 地址的值将被放置在 r 所持有的地址中。

    并且对于第 10 步增量指针将根据它是指针的数据类型的大小而增加。例如,如果它的 int 取决于编译器,它将增加 2 个字节或 4 个字节。 第三步也是如此。

    除此之外,一切看起来都不错。

    【讨论】:

      【解决方案3】:

      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 指向 a 的地址

      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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多