OhaystackO

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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,指针指向内存只读并且指针变量本身只读

 

posted on 2020-04-06 10:42  OhaystackO  阅读(124)  评论(0编辑  收藏  举报