【问题标题】:C array pointer incrementC数组指针增量
【发布时间】:2018-07-28 15:53:57
【问题描述】:

有人解释一下这个程序。我有一个使用数组中的指针的 C 代码。对于下面的程序

 #include<stdio.h>
    void function(char**);
    void main()
    {
        char *arr[] = {"ant","bat","cat","dog","egg","fly"};
        function(arr);
    }
    void function(char **ptr)
    {
        char *ptr1;
        ptr1 = (ptr+=sizeof(int))[-2];
        printf("%s\n",ptr1); 
    }

当使用索引 -2 时,我得到的输出为 cat。从右上角开始,索引值从 1 开始。这是怎么发生的。索引值如何以这种方式表现而不是从左侧从 0 开始其索引位置。我希望以下值在数组中

index value
0   ant
1   bat
2   cat
3   dog
4   egg
5   fly

但是输出是什么

index value
-4  ant
-3  bat
-2  cat
-1  dog
0   egg
1   fly

这是如何工作的?

【问题讨论】:

  • 你对ptr+=sizeof(int)有什么期望?
  • 您的系统上似乎 sizeof(int) 是 4。
  • 您的输出与您发布的代码不匹配。你的代码也是无意义的
  • 使用在线编译器我的ptr1 = *(ptr+=sizeof(int)) 指向egg,所以[-2] 从那里退后2 步得到cat。所以看起来你的系统和教程点在线编译器一样。
  • 这个问题来自“Zoho corp”采访。所以我只是想了解这一点并知道它是如何工作的。

标签: c arrays pointers indexing


【解决方案1】:

好的,您的程序有一些问题,但我会尽力...

首先,您的问题在于ptr1 = (ptr+=sizeof(int))[-2]; 行我无法理解您期望它会做什么,但它实际上会做什么是ptr = ptr[4]; ptr1 = ptr[-2]

我试图发布一些调试信息以更清楚地说明此事,

内存中映射的字符串

0x400624 ant
0x400628 bat
0x40062c cat
0x400630 dog
0x400634 egg
0x400638 fly

验证sizeof(int) 是 4

function的开头

*ptr - 0x400624 - "ant"

分配给ptr1之后

*ptr - 0x400634 - "egg"
ptr1 = 0x40062c - "cat"

如你所见

  1. ptr 现在指向“egg”,因为它的实际分配是 ptr = ptr[4]
  2. ptr1 现在指向“cat”,因为它被分配了ptr1 = ptr[-2]

您应该阅读两件事:“C 求值顺序”和“指针算术”

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多