使用 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]);
}
}
非常感谢任何建议,
答案 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]
为您提供指向i
中src
个字符的指针}。
答案 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
,如果您愿意的话。