第七章:指针
一、指针的基本语法
-
指针:是内存单元的地址,使用指针可以更灵活访问内存单元中的数据
-
变量是存放数据的内存单元,变量的地址就是指针,而且不同类型的变量有不同类型的指针
-
指针的定义:数据类型 *指针变量名 [= 初始值 ] ; // 初始值可以省略
(1) 数据类型是指针所指向的内存单元的类型。前面数据类型是int型,则定义的为int类型指针变量;为float型,则定义的为float类型的指针变量 (2) 初始值是数据类型的内存单元的地址,可以省略不进行初始化,null(代码值为0)可以作为任意类型指针变量的初值 (3) 案例:int i, *p; // 声明int类型的变量i,变量p是指向int类型变量的指针 int *q; // 声明一个指针变量p,指向 int类型变量 char *cp; // 声明一个指针变量cp,指向字符类型变量 float *fp; // 声明一个指针变量fp,指向float类型变量 double *dp1,*dp2; //声明两个指针变量dp,指向双精度变量
-
指针的赋值:
(1) &:地址运算符,可以获取对象类型变量的地址 (2) int i, *p; p = &i; // 将int类型变量i的地址取出,得到int类型指针,将它赋值给int类型指针变量p中保存 p = 0; // 将特殊值赋值给指针p,这时指针为NULL,代表空指针,不指向任何单元 p = NULL; // 同上
-
指针变量的注意事项
(1) 指针变量名是一个标识符,要按照c标识符的命名规则对指针变量进行命名 (2) 指针变量的数据是它所指向的变量类型,一般情况下一旦指针变量类型被确认后,它只能指向同类型的变量 (3) 在定义指针变量时需要使用指针声明符 *,但指针声明符并不是指针的组成部分。 例如:int *p; // 说明p是指针变量,而不是 *p
二、指针的运算
-
指针的直接使用
(1) 取地址运算:单目运算符 &,用于取出变量的地址 int i, *p; (2) 显示:printf函数可以使用格式符 %p可以将指针以16进制方式显示出来 int i; printf("%p",&i); (3) 加减整数 n,常应用在数组元素的指针上,当前数组元素指针加整数n,表示当前数组元素之后的第n个元素地址 例如:int a[10],*p1=a+5,*p2=p1-3; 解析:p1指针变量中存放a[0]之后的第5个元素的地址,即a[5]的地址;p2指针变量存放a[5]往前三个元素的地址,即a[2]的地址 (4) 两个同类型的指针相减:常用在数组元素的指针上,同一个数组的两个数组元素地址相减,结果是两个数组元素的下标之差: 例如:int a[10],*p1=&a[0],*p2=&a[9],n=p1-p2; 解析:变量n中存放的是下标差 -9 (5) 指针变量的自增++、自减--运算:常用在指向数组元素的指针变量上,++使指针变量指向下一个数组元素,--使指针变量指向删一个数组元素 int i,a[5]={1,2,3,4,5},p=a; // 通过指针p访问数组a中的每个元素变量 for(i=0;i<5;i++){ printf("%3d",*p++); }
-
指针的间接使用
(1) 间接访问指针运算是*号运算符,指针通过 * 运算可以访问所指向的内存单元 (2) 例如:int i,*p=&i; // 这里的 * 号是定义指针变量的符号 *p=100; // 此处的*是间接访问运算,*p可以访问p所指向的变量i,将100赋值给i 例如:间接访问指针也可以使用[]运算 int a[10],*p=a,i=1; p[i]=20;//p[i]相当于 *(p+i),访问数组a的元素a[1],使a[1]=20; p=a+5; //p保存了a[5]的地址 p[i]=30; // p[i]相当于 *(a+5+i),访问数组a的元素 a[6],使a[6]=30