初始化字符数组名称和地址后指的是相同的。 s []是一个数组。所以它衰减到指针 s ,& s 应该给出指针的地址 s
#include <stdio.h>
int main()
{
char s[]="Get Organised! learn C!";
printf("%u %s\n",&s[2],&s[2] );
printf("%u %s\n",s,s ); /* This line and below line is equivalent*/
printf("%u %s\n",&s,&s ); /* Please Explain */
printf("%u %s\n",s[2],s[2] );
printf("%u %s\n",s[3],s[3] );
return 0;
}
%u只是用来看看里面发生了什么。
答案 0 :(得分:1)
首先摆脱未定义的行为:
int main() {
char const string [] = "hello";
printf("%p %p\n", (void *) string, (void *) &string);
return 0;
}
你得到(可能是那个依赖于目标的)这里打印的相同地址,因为第一个表达式被隐式转换为指向数组第一个元素的指针,而第二个表达式是指向整个数组的指针(很可能恰好从它的第一个元素开始)
string == &(string[0]) // this is often called decaying
表达式string
的类型(或者更确切地说是它衰减的表达式)是char const *
,而&string
的类型是char const (*array)[6]
,所以他们&#39;不要&#34;相同&#34;。
&string
不是指针指针的原因很简单:C标准明确禁止以运算符(&
)的地址为前缀的数组表达式(或在sizeof
运算符内部)隐式转换为指针。
答案 1 :(得分:0)
使用以下内容,s
为array 100 of char。当is传递给printf()
时,数组s
将转换为第一个元素的地址的值和类型。因此,printf()
会获得char *
。
&s
是char 数组100的地址。它具有与s
等效的值,但是类型不同。
char s[100]="Whatever";
printf(some_format,s);
printf(some_format,&s);
要正确打印变量,文字的地址,强制转换为(void*)
并使用"%p"
。打印输出通常缺少变量的类型的任何描述。
printf("%p\n",(void*) s);
printf("%p\n",(void*) &s);
输出
0x28cbdc
0x28cbdc
要查看类型差异的影响:
printf("%zu\n",sizeof *(s));
printf("%zu\n",sizeof *(&s));
输出
1
100
@john bode之前也提到了这一点。