【问题标题】:dereferencing an array取消引用数组
【发布时间】:2010-08-20 02:49:36
【问题描述】:

使用 gcc 4.4.3 c89:

我正在处理以下代码:

我只是对取消引用 src 指针有一些疑问。在调用函数中声明为:

char src[] = "device_id";

我的困惑在于取消引用 src:

for(i = 0; src[i] != '\0'; i++) {
    printf("src %d: [ %s ]\n", i,  &src[i]);
}

src 已衰减为指针。所以 src 将指向数组中的第一个元素,即字符 d:

src -> "device_id"

所以当我这样做src[i] 时,我正在取消引用该值,因此它将返回当前指向的字符。对于这个例子,当它到达 nul 时,它将从 for 循环中中断。

For example i = 0

对于&src[i],我得到的是角色的地址而不是角色本身吗? 所以src[i]会在哪里解引用并返回d,&src[i]会返回d的地址。

因为*dest[] 是一个字符指针数组,所以它需要一个地址。所以在这里我将字符的地址分配给指向 char 的指针数组。

dest[i] = &src[i];

使用&src[i]src[i] 在 %s 的 printf 函数中执行此操作是否有区别:

printf("src %d: [ %s ]\n", i,  &src[i]);

printf("src %d: [ %s ]\n", i,  src[i]);

源代码:

void inc_array(char *src, size_t size)
{
    /* Array of pointers */
    char *dest[size];
    size_t i = 0;

    memset(dest, 0, size * (sizeof char*));

    /* Display contents of src */
    for(i = 0; src[i] != '\0'; i++) {
        printf("src %d: [ %s ]\n", i,  &src[i]);
    }

    /* copy contents to dest */
    for(i = 0; i < 9; i++) {
        dest[i] = &src[i];
    }

    /* Display the contest of dest */
    for(i = 0; *dest[i] != '\0'; i++) {
        printf("dest %d: [ %s ]\n", i, dest[i]);
    }
}

非常感谢您的任何建议,

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    对于&amp;src[i],我得到的是角色的地址而不是角色本身吗?所以src[i]会在哪里解引用并返回d&amp;src[i]会返回d的地址。

    src[i]等价于*(src + i),所以&amp;src[i]&amp;*(src + i)相同,可以简化为src + i。它只是执行指针运算,并没有发生解引用。

    src[i] 在索引i 处为您提供src 中的字符,&amp;src[i] 为您提供指向srcith 字符的指针。

    【讨论】:

    • 既然可以写src[i],为什么还要写*(src + i)?这对我来说似乎是不必要的混乱。
    【解决方案2】:

    格式说明符 %s 想要插入一个字符串,所以如果你传递它 &src[i],它将从 src 的第 i 个字符开始并打印到空终止符。你几乎肯定想要 %c 而不是 %s,以及 src[i] 而不是 &src[i]。

    【讨论】:

      【解决方案3】:

      是的,有区别。 &amp;src[i]src[i] 的字符地址,正如您所说的那样。 src[i] 是角色本身。

      对于使用"%s" 打印和分配给char * 对象,&amp;src[i] 是正确的公式。

      (顺便说一句,&amp;src[i]也可以写成src + i,如果你喜欢的话)。

      【讨论】:

        猜你喜欢
        • 2013-07-06
        • 1970-01-01
        • 2021-02-08
        • 2015-06-13
        • 2014-01-11
        • 1970-01-01
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多