s []是一个数组。& s应该给出衰减指针的地址

时间:2016-03-10 19:05:14

标签: 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*/
   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只是用来看看里面发生了什么。

2 个答案:

答案 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)

使用以下内容,sarray 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之前也提到了这一点。