C 初阶指针

目录

一、指针是什么

二、指针变量的类型

三、野指针

四、指针运算

1、指针 +- 整数

2、指针 - 指针

3、指针的关系运算

五、指针和数组

六、二级指针

七、指针数组 


这两天把初阶指针学了

一、指针是什么

        在计算机的内存管理中,系统把内存以1byte为单位进行切割,每个内存单元所对应的编号就是地址,而指针就是地址。

        我们平时说的指针是指指针变量,指针变量是用来存放地址的。

        对于32位的地址,地址线有32条,也就是32bit = 4byte,即在32位的系统中指针变量的大小位4byte,以此类推,64位系统的指针变量大小位8byte。

二、指针变量的类型

        数据的存储有int、long、short等不同类型,相对的,指针也有不同类型。将不同类型的数据的地址存入指针变量时,我们一般使用数据所对应的类型作为指针变量的类型,即int ~ int*,这是因为指针变量的类型决定了指针变量操作(如修改、读取等)的内存的大小。

C 初阶指针_第1张图片 如图,这里不同类型的指针变量在+1后,后移的量不同

        相应的,在通过指针变量找到对应数据并修改时,根据指针变量的类型不同,所修改的数据大小也不同,修改时只会改变地址后的对应内存大小(  int* -- 4byte   char* -- 1byte   double* -- 8byte ,以此类推,如char类型的指针变量只会修改后面1byte的内容),即不同的指针类型的意义为以不同的方式访问内存。

注意:大小相同的整形和浮点型指针不能混用,如float* 和 int* 的大小都是4byte,但是二者不能混用,因为浮点数和整形存入内存的方式不同。

三、野指针

野指针的定义:指向位置不可知(随机、不正确、没有限制等)的指针。

常见野指针成因:

1、指针未初始化C 初阶指针_第2张图片

2、指针越界访问 

C 初阶指针_第3张图片 此处i设置错误,导致*p越界访问

 3、指针指向的空间被释放

C 初阶指针_第4张图片 这里的b在调用完test函数后就被销毁

 (此处b的地址虽然给了p,但是出了test函数后,b已经被销毁,内存还给系统了,所以p虽然有地址,但是算野指针)

(此处虽然销毁了局部变量,但是数据还在,所以还能读取(但是此时的栈帧有可能被改变,即不能保证值有没有被改变)

四、指针运算

1、指针 +- 整数

C 初阶指针_第5张图片 此处指针++即为跳过一个int大小的空间

注意:*vp++ != (*vp)++

2、指针 - 指针

指针减去指针得到的绝对值是指针和指针之间元素的个数

C 初阶指针_第6张图片

不是所有指针都能相减,指向同一块空间的指针(即同一个数组等)才能相减(否则无意义)

3、指针的关系运算

指针之间的比较

C 初阶指针_第7张图片

 注意:在C语言的规范中,允许指针与指向数组最后一个元素后面的指针进行比较,但是不支持和数组前面一个元素的指针进行比较。

五、指针和数组

数组名表示的是首元素地址。

(注意有两种意外:1、sizeof(arr),括号内的数组名表示整个数组;2、&arr,这里的数组名也表示整个数组。)

由于数组名表示的是数组首元素地址,因此可用指针来访问数组内的元素(见上图)。

六、二级指针

指针变量作为一个数据,其自身也需要内存进行储存

而二级指针变量是用来存放一级指针变量的地址

C 初阶指针_第8张图片

在解引用是,*p找到a,*pp只是找到了p,而**pp才能找到a。

注意:在 int** 中,int* 表示pp指向的对象是 int* 类型,而第二个 * 表示pp是一个指针变量。

七、指针数组 

存放指针的数组就是指针数组C 初阶指针_第9张图片

(parr两侧的()可加可不加)

可以通过指针数组来关联多个数组:

实现类二维数组的效果

C 初阶指针_第10张图片

你可能感兴趣的:(C语言学习记录,c语言)