使用& with array返回意外结果

时间:2016-02-24 03:10:22

标签: c

我一直在学习C并遇到以下代码。我知道它的作用,但我不知道为什么会这样做。

char str[5] = "hele";
printf("string is %s: \n", &str[1]);

output:
ele

为什么& str [1]输出ele?从我到目前为止所读到的,&返回地址因此不应该& str [1]返回" e"的地址。由于输出是',我知道情况并非如此,但我无法弄清楚原因。所有帮助都表示赞赏。

3 个答案:

答案 0 :(得分:0)

这是因为C字符串只是内存中的一些字符,后跟一个空字符。 str在内存中有一些地址,&str[1]等同于str + 1(数组变成该表达式中的指针)。你得到的是一个指向原始字符串中间的指针,它也是一个有效的字符串,只是错过了开头。

在记忆中它的样子是这样的:

[h ] [e ] [l ] [e ] [\0]
 ^ str points here

printf打印字符串时,它会接收指向第一个字符的指针,就像大多数处理字符串并打印字符的函数一样,直到它到达终止空值(\0)。如果您传入str + 1,它将很乐意从索引1开始打印字符串的一部分。

答案 1 :(得分:0)

这是printf的原型:

int printf(const char *format, ...);

它与转换说明符一样,如%d,%a,%s,%c ...

如果使用%sconst char *参数应该是指向字符数组(指向字符串的指针)数组的指针。

回到您的案例:

&str[1]确实指向'e',它是指向字符串的指针,因此printf的参数显然具有正确的类型。

接下来printf做什么,看看Cobster的优质评论

  

printf函数中的%s使用它作为字符串的开头   将继续,直到遇到空终止符

答案 2 :(得分:0)

首先,c中的字符串基本上是一个字符数组。所以你的字符串实际上包含

h (position 0) e (position 1) l (position 2) e (position 3) \0 (position 4)

括号中的所有内容仅供参考。

&运算符返回变量的地址或数组元素的地址。

所以当你这样做时

printf("string is %s: \n", &str[1]);

&str[1]返回str [1]的地址。如果您将%c放在printf中,则str [1]元素的值(e)将被打印出来。但是当你放%s时,printf将它作为必须打印的字符串的开头,然后打印字符串,直到它遇到空终止符(\0)。

为了更好的解释:

  

有一个字符串,其内容为heleh是第0个元素,e是第1个元素,l是第2个元素,e是第3个元素,\0是第4个元素。该字符串基本上是一个char数组,其中每个元素都是char。他们每个人都有一个地址。所以做&str [1]会返回char array的第一个元素的地址。然后,%s将其作为要打印的字符串的开头,并打印字符串,直到遇到空终止符(\0)。因此,它将字符串的开头作为1st e或第1个元素。然后打印le,然后它会遇到空终止符,它停在那里。