指针常量
int const *p;
表示P是一个指向常量的指针,这种情况下,编译器会讲p所指向的对象当作常量处理,即便不是常量。
所以无法改变其指向的对象的值,但是指针本身的值即其指向可以发生改变。
常量指针
int *const p
表示指针是一个常量,其本身值(即其指向)不可以修改,但是其指向的值(无论是常量还是变量)可以发生修改
常量指针常量(我也不知道是不是这么叫的)
const int *const p
表示指针是一个常量,其本身值(即其指向)不可以修改。其指向的目标也是一个常量,值也不可以修改。
const int a = 10;
int *p = &a;
*p = 100;
.c文件下虽然能编译成成功,a的值确实也修改了,但是会有警告。.cpp是直接报错。
所以还是要做到类型匹配,既然是常量,就不要去修改它的值。
所有的指针的值都是一个地址,所有的地址都可以认为是一个没来得及起名字的指针。
间接级别问题
char *a[10] 是一个指针数组
如果要定义一个指向该数组的指针,应该定义成二级指针 char **p = a;
否则会提示 char* 与 char**就间接级别不同
指针只能指向已经分配好的内存区域
char *p;
p = “hello world”;
内存先开辟一个空间,将常量字符串”hello world”写入该存储区域,然后将首地址赋值给p,那么此时p指向的是一个字符串常量。
此时不允许修改p指向的值。但是可以改变p的指向。
p = “hello boy”
通过打印地址可以发现,p的值发生了改变。
如果需要通过终端输入来给p赋值,那么需要提前分配内存
p = (char*)malloc(sizeof(char));
gets(p);
此时虽然编译可以通过,但是如果输入的字符串过长,有可能导致程序崩溃。
因为我们申请内存的时候只申请了一个字节的区域,如果该字节地址往后的区域
未占用我们可以一直输入,一旦我们输入的字符串长度过长,没有足够空白空间来存储就会崩溃。
所以在申请是应该尽可能了制定长度。
p = (char * ) malloc(sizeof(char)*1000);