引言
C语言学习笔记(中)-CSDN博客本章的学习笔记中,介绍了循环语句,分支控制语句、数组、辅助控制关键字等知识,本章学习笔记将要介绍指针、数组指针、指针数组等知识点。如果有错误的地方,还请广大朋友批评指正。
一、指针
内存用于保存各种数据,内存中每个字节的空间都有着自己的一个编号,这个编号就是指针。相应的保存指针的变量叫做指针变量。
& 取地址符,获取变量在内存中占用的空间的地址编号,通常将首地址定义为地址最小的那个地址。
* 取表示作用,表示定义的是一个指针变量
1.格式:
存储类型 数据类型 *指针变量名
2.指针的基本使用
定义一个指针变量来保存变量的地址,指针保存了变量的地址,称之为指针指向变量,当指针保存了变量的地址后,就可以通过指针指向的空间的内容。
指针变量也是变量的一种,值允许改变,指针的值改变,当指针的值改变的时候称为指针的指向改变了
当指针没有初始化的时候,里面存的就是随机值,这种不确定的指针,称为野指针。
3.指针的运算
指针的运算本质就是将指针所指的地址作为数据计算,常见的运算包括算术运算、关系运算、赋值运算。
算术运算:+ - ++ --
关系运算: < > == !=
赋值运算:=
注意:指针的运算与指针的数据类型有关系,,通常情况下,只有相同类型的指针的运算才有意义。
二、指向一维数组的指针作用
数组名就是数组的首地址,可以定义一个指针来保存数组的首地址,写法如下:
int *p = s;
int *p = &s[0];
上面的写法中s是数组,p为指针
当指针指向数组后,有着下面的等价关系
s[i] <==> *(s+i) <==> p[i] <==> *(p+i)
三、二维数组的指针作用
二维数组的数组名是一个地址常量,也就是数组的首地址。
注意:二维数组的数组名的操作空间是一整行元素,例如s+1加的就是一整行
*操作可以给行指针降维,降维的意思是将行指针降成操作空间是一个元素的指针,而当对降维后的指针再一次去*操作后,就是在操作内部的数据
四、数组指针
数组指针是一个指针类型,指向一个二维数组,数组指针一般多用于函数传参。
格式:
数据类型 (*数组指针名)[列宽]
定义了一个数组指针 p,p指针能指向 int 类型的列宽为3的二维数组,用法如下
int s[2][3] ={{1,2,3},{4,5,6}};
int (*p)[4] = s;
指针指向二维数组后 就有下面6个等价关系
s[i][j] <==> *(s[i]+j) <==> *(*(s+i)+j)
p[i][j] <==> *(p[i]+j) <==> *(*(p+i)+j)
五、指针数组
指针数组是一个数组,数组中的每个元素都是一个指针类型。
格式:
数据类型 *指针数组名[下标];
六、二级指针
二级指针的作用是保存一级指针的地址,二级指针多用于函数传参
格式:
数据类型 **二级指针名;
二级指针的使用方法:
int a = 1;
int *p = &a;
int **q = &p;
上述代码的执行结果的等价关系如下:
**q <==> *p <==> a , *q <==> p
七、虚拟内存的分区
注意:栈区的内存是允许修改的,字符串常量区是不允许修改的,堆区的内存空间是有人手动分配和回收的,栈区由操作系统负责分配和回收
八、const关键字
const用来修饰的变量,表示的是一个只读变量,不可以修改
注意:const用来修饰指针的时候,需要注意const 和 * 的位置
1.如果const在 * 的左边此时表示修饰的是指针,意思是不能通过这个指针改变指向空间的内容,但是指针的指向是可以修改的。
2.如果const 在 * 的右边此时表示修饰的指针的指向,意思是指针的指向不能被修改,但是可以通过指针修改指向空间里面的内容。