必须在使用前初始化指针,然后如何理解char*p?

Fan*_*anl 4 c c++ pointers

新学员; 关于指针的一些难题;

当我从书本中学习时,在使用指针之前必须对其进行初始化,因此我们通常会这样使用

int a = 12;

int * p = &a; 
Run Code Online (Sandbox Code Playgroud)

所以我明白为什么int* p = 12 是错的,因为它没有地址;

然后我在编码的时候找到了一些东西,就是这样:

char * months[12] = {"Jan", "Feb", "Mar", "April", "May" , "Jun", "Jul"    
,"Aug","Sep","Oct","Nov","Dec"};
Run Code Online (Sandbox Code Playgroud)

然后又出现了另一个常用的情况,那就是:

char *p = "string"; (this is ok , why int * a = 12 can't be allowed ?)
Run Code Online (Sandbox Code Playgroud)

我很困惑.什么时候初始化,如何?为什么int * a = 12不能自动初始化?也许是关于记忆的安排.

zne*_*eak 8

首先:

int a = 12;
int* p = &a;
Run Code Online (Sandbox Code Playgroud)

这是因为&a是一个内存地址.

int* p = 12;
Run Code Online (Sandbox Code Playgroud)

这主要是因为12不是内存地址.同样地,12本身没有地址,但这会更好地反映在一个片段上int* p = &12;(正如你所正确指出的那样无效).

指针的一个有趣属性是它们通常用于指定值列表的开头.例如,取这个整数数组:

int a[] = {1, 3, 7, 13};
Run Code Online (Sandbox Code Playgroud)

它可以简单地变成一个整数指针.

int* p = a; // magic!
Run Code Online (Sandbox Code Playgroud)

指针对象是第一个元素a,所以*p == 1.现在,你也可以做p[0](这是1,太), ,p[1] == 3,p[3] == 7p[4] == 13.

原因char* foo = "bar"之一是"bar"不是单个值:它是伪装的字符数组.单个字符用单引号表示.事实上:

"bar"[0] == 'b'
"bar"[1] == 'a'
"bar"[2] == 'r'
Run Code Online (Sandbox Code Playgroud)

编译器对字符串文字(引用字符串)有特殊支持,可以直接将它们分配给指针.例如,char* foo = "bar"有效.

符合C99的编译器也支持数组文字.例如,int* p = (int [3]){1, 2, 3};有效.字符数组和int数组将被赋予一个全局地址,因为让C的人认为这是一个有用的事情.

  • 完整性:`"bar"[3] =='\ 0'`. (3认同)
  • "与数组文字相反":C语言15年来一直支持数组文字:http://stackoverflow.com/questions/5495983/c-compound-literals-pointer-to-arrays (2认同)
  • @zneak我相信你错过了我的评论.请参阅https://ideone.com/08sVYR并再次告诉我,无法将数组文字分配给指针. (2认同)