我一直在学习C并遇到以下代码。我知道它的作用,但我不知道为什么会这样做。
char str[5] = "hele";
printf("string is %s: \n", &str[1]);
output:
ele
为什么& str [1]输出ele?从我到目前为止所读到的,&返回地址因此不应该& str [1]返回" e"的地址。由于输出是',我知道情况并非如此,但我无法弄清楚原因。所有帮助都表示赞赏。
答案 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 ...
如果使用%s
,const 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
)。
为了更好的解释:
有一个字符串,其内容为
hele
。h
是第0个元素,e
是第1个元素,l
是第2个元素,e
是第3个元素,\0
是第4个元素。该字符串基本上是一个char数组,其中每个元素都是char
。他们每个人都有一个地址。所以做&str [1]
会返回char array
的第一个元素的地址。然后,%s
将其作为要打印的字符串的开头,并打印字符串,直到遇到空终止符(\0
)。因此,它将字符串的开头作为1ste
或第1个元素。然后打印l
和e
,然后它会遇到空终止符,它停在那里。