取消引用数组

时间:2010-08-20 02:49:37

标签: c pointers

使用 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指针数组,所以它需要一个地址。所以我在这里将字符的地址分配给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]);
    }
}

非常感谢任何建议,

3 个答案:

答案 0 :(得分:2)

  

对于&src[i]我是否得到角色的地址而不是角色本身?因此,src[i]取消引用并返回d&src[i]将返回d的地址。

src[i]相当于*(src + i),因此&src[i]&*(src + i)相同,可以缩减为src + i。它只是执行指针运算而不会发生解除引用。

src[i]为您提供src索引i中的字符,&src[i]为您提供指向isrc个字符的指针}。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

对于使用"%s"进行打印并分配到char *对象,&src[i]是正确的配方。

(顺便说一句,&src[i]也可以写成src + i,如果您愿意的话。