为什么那些打印出相同的结果?

时间:2014-07-08 14:26:32

标签: c string pointers

给出声明:

char message[] = "hello, world"

为什么那些会打印相同的结果?

printf ( "%s", message );
printf ( "%s", &message[0] );

我所知道的是,%s只读取字符串的第一个地址。 char message[]也被声明为char字符串(char *message)的指针,而message只读取字符串的第一个地址。但是对于message[0],也会被视为*(message + 0),我是否认为它是这样的?

&message[0] = &*(message + 0) = &*message = message

5 个答案:

答案 0 :(得分:5)

当作为参数传递给函数时,数组名称转换为指向第一个元素的指针    message衰减到指向第一个元素的指针。它在衰变后具有char *类型。 &message[0]是第一个元素的地址。它也是char *类型。

&message[0]相当于

&(*(message + 0) ) =  &(*(message)) = &*(message) = message  

&*取消了彼此的影响。

答案 1 :(得分:4)

你是对的,当数组名称作为函数参数传递时,它会衰减到指向其第一个元素的指针,因此message&message[0]在代码中具有相同的值。

答案 2 :(得分:1)

两个表达式都指向第一个字符 - 而printf一直持续到达'\0'

答案 3 :(得分:0)

字符串是由NULL字符(\ 0)终止的字符数组。

所以  message[] = "hello, world"

所以message或& message [0]表示字符串“hello,world”的起始地址。 因此printf(“%s”,)需要字符串的起始地址。由于消息或& message [0]给出起始地址,显示的结果将相同。

答案 4 :(得分:0)

当你使用带有%s的printf时,它会从你提供的字符写入字符,直到\ 0(NULL)。如果我们说“message”给出了a03F地址指向printf函数,它开始在A03F地址写入char并继续写入NULL字符。 回答你的问题是的,他们是一样的; 如果消息返回A03F地址,则& message [0] A03F地址也是如此。因为当你声明一个数组时,该变量返回该数组的第一个地址 - 实际上它也是一个指针 -