0.指针的核心(万变不离其宗):
①指针也是一种变量,只要是变量就可以赋值
②指针指向谁就把谁的地址给指针
③*p是操作指针指向的内存,即,指针代替指针所指向的变量行使某些权力
1.内存分配的标号叫做编码,根据地址找到对应得内存叫做寻址。每个变量都有一个标号,这个标号是一个地址。
2. int *p = &a; 其中,p是一个指针,指针时一种数据类型是普通变量,即,可以赋值。
p = NULL;//操作指针本身,操作一个普通变量 *p = 100;//操作指针指向的内存,在这里是相当于给a变量赋值
3.定义指针变量时,*和前面的数据类型是一个整体是一种数据类型,使用指针变量时,*意为指针指向的内存 。
4.野指针,保存了无意义地址的指针(非法地址),只有定义后的变量的地址才适合法地址,操作也指针本身没有问题,但是操作野指针指向的内存会出现段错误。
int a[10] = {0}; int *p;//指针未赋值时值为随机数,此时p为野指针 p = NULL;//操作也指针本身,正常运行 *p = 100;//试图操作野指针指向的非法内存,err:段错误 p = &a[0]; *p = 100;//p指向合理内存,操作p指向的内存,正常
5.可以定义void类型的指针,但是不能定义void类型的变量,因为不确定数据类型不能为变量合理分配内存空间。
6.指针在指向一个变量时,只会指向该变量的首地址,例如:
int a=0; int *p = &a;
变量a在内存中占4个字节,这个时候p指向的是变量a的第一个字节的位置:
7.指针在指向一个变量时只会指向这个变量的首地址,但是如果想要操作一个变量需要知道这个变量完整的地址,所以指针会根据指针类型的不同改变步长,以确保在通过*p所指向的内存有头有尾。在使用void类型的指针时需要根据所指向的变量的类型去对void指针进行类型转换,有了准确类型的指针才有步长。
8.const关键字修饰的指针变量:
int a; int *p = &a; *p = 100;//操作指针所指向内存,即,代替变量a行使某些权力 const int *p1 = &a;//const关键字修饰最近的字符 *(int是关键字不是字符),代表指向的内存只读 *p1 = 0;//err,此时p1指向的内存只读 int * const p2 = &a;//const修饰p2,指针本身只读 p = NULL;//err,指针变量只读 const int * const p3 = &a;//const修饰*和p3,指针指向内存只读并且指针变量本身只读