给出声明:
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
答案 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地址也是如此。因为当你声明一个数组时,该变量返回该数组的第一个地址 - 实际上它也是一个指针 -