Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C s[]是一个数组;s应该给出衰减指针的地址_C_Arrays_String_Pointers - Fatal编程技术网

C 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

初始化字符数组后,名称和地址引用相同。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;
}
#包括
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
的地址一样)