C s[]是一个数组;s应该给出衰减指针的地址
初始化字符数组后,名称和地址引用相同。s[]是一个数组。因此它衰减为指针s,&s应该给出指针s的地址C s[]是一个数组;s应该给出衰减指针的地址,c,arrays,string,pointers,C,Arrays,String,Pointers,初始化字符数组后,名称和地址引用相同。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*/ prin
#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;
}
#包括
int main()
{
char s[]=“组织起来!学习C!”;
printf(“%u%s\n”、&s[2]、&s[2]);
printf(“%u%s\n”,s,s);/*这一行和下面的行是等效的*/
printf(“%u%s\n”、&s、&s);/*请解释*/
printf(“%u%s\n”,s[2],s[2]);
printf(“%u%s\n”,s[3],s[3]);
返回0;
}
%u只是用来查看里面发生了什么。首先摆脱未定义的行为:
int main() {
char const string [] = "hello";
printf("%p %p\n", (void *) string, (void *) &string);
return 0;
}
这里打印的地址(可能与目标有关),因为第一个表达式隐式转换为指向数组第一个元素的指针,而第二个表达式是指向整个数组的指针(很可能从第一个元素开始)
表达式string
(或者更准确地说,它衰减到的表达式)的类型是char const*
,而&string
的类型是char const(*array)[6]
,因此它们不是“相同的”
&string
不是指向指针的指针的原因很简单:C标准明确禁止以操作符地址(&
)为前缀的数组表达式(或sizeof
操作符内的数组表达式)隐式转换为指针。如下所示,s
是一个指针。当is被传递到printf()
时,数组s
被转换为第一个元素的地址的值和类型。因此,printf()
被赋予一个char*
&s
是字符数组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
1
100
要查看类型差异的影响,请执行以下操作:
printf("%zu\n",sizeof *(s));
printf("%zu\n",sizeof *(&s));
输出
0x28cbdc
0x28cbdc
1
100
之前也提出过这一点。这都是未定义的行为<代码>%u要求您传递的是
int
或无符号int
,而您没有。不,我要求的是printf(“%s\n”,s);printf(%s\n“,&s);给出了相同的答案这是因为数组会衰减为指针。确认,您更改了我的问题。简短的回答-s
当它是一元&
或sizeof
运算符的操作数时,不会转换为指针,因此s
和&s
的值是相同的(数组第一个元素的地址),但类型不同(分别是char*
和char(*)[28]
)。即使&s
给出了它衰减到的指针的地址,也没有意义,因为该指针不是变量。(这就像说&1
来获取1
的地址一样)