新学员; 关于指针的一些难题;
当我从书本中学习时,在使用指针之前必须对其进行初始化,因此我们通常会这样使用
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不能自动初始化?也许是关于记忆的安排.
首先:
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] == 7和p[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的人认为这是一个有用的事情.