C程序设计中使用指针可以使程序简洁、紧凑、高效,有效地表示复杂的数据结构,动态分配内存,得到多于一个的函数返回值
在计算机内存中,每一个字节单元,都有一个编号,称为地址
指 针
指针就是地址
内存以字节为单位开始编号,这个编号就是地址,在c语言里面我们把内存的地址称为指针,专门用来存放地址的变量就称为指针变量。
两指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相隔数据的个数。
指针++或--指的是针所指向的地址单元向地址增大或减小的方向偏移一个数据类型的大小
不同数据类型的两个指针实行加减整数运算是无意义的
a[i]、(p+i)、(a+i) 和 p[i] 具有完全相同的功能:访问数组第i+1个数组元素。
a[i] = *(a+i)
p[i] = *(p+i) = a[i]
注意:a++这样的写法是不可以的,p++可以
二维数组a【】【】
a[0] = *a
a[1] = *a+1
a[2] = *a+2
int *p = &a【0】【0】指向二维数组的首地址,int *p = a的写法是错误的的
二维数组的a+1是切换到下一行的首地址,p+1和一维数组一样,是遍历一个数据
*a表示的是第0行的首地址
*a+1 = a【1】表示第1行的首地址
行指针(数组指针)
例如,int a【2】【3】;int (*p)【3】
可以直接写成p = a把a,使p指向a的首地址,而且p【1】【1】=a【1】【1】
方括号中的常量表达式表示指针加1,移动几个数据。
字符指针
在内存管理的角度:1.全局变量 2.static修饰的变量 3.字符串常量 这三种情况下数据存放在静态区,只有程序结束的时候才会释放内存,一旦分配后永远占据内存
void指针
void指针是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量
一般形式为: void* <指针变量名称> ;对于void指针,在没有强制类型转换之前,不能进行任何指针的算术运算
const变量
常量化变量的值一般说明形式如下:
const <数据类型> 变量名 = [<表达式>] ;
常量化变量是为了使得变量的值不能修改变量有const修饰时,若想用指针间接访问变量,指针也要有const修饰。
常量化指针目标表达式
常量化指针变量及其目标表达式,使得既不可以修改<指针变量>的地址,也不可以通过*<指针变量名称>修改指针所指向变量的值
如:
const int *p
则(*p)++会报错
常量化指针变量
使得<指针变量>存储的地址值不能修改。但可以通过 *<指针变量名称> 可以修改指针所指向变量的数值
如:
int * const p
则 p = &m 会报错
常量化指针变量及其目标表达式*
const <数据类型> * const <指针变量名> = <指针运算表达式>
常量化指针变量及其目标表达式,使得既不可以修改<指针变量>的地址,也不可以通过*<指针变量名称>修改指针所指向变量的值