1.指针的定义
将地址形象化地称为“指针”,地址指向该变量单元。
按变量名访问称为直接访问
使用指针称为间接访问(把变量地址赋给一个指针变量,间接访问,变量地址做中间量)
指针变量:是用来存放地址的变量
指针是一个地址
2.指针变量的定义
类型名 * 指针变量名;
int * pointer_1, *pointer_2; //int是“基类型” int只能指向为整型的变量
float * pointer_3; //float指针
char * pointer_4; //char指针
指针变量前面的 * 表示该变量是指针变量,指针名是pointer_1
3.指针变量的引用
int a=1;
int * pointer_1;
pointer_1=&a //把a的地址赋值指针变量p
print("%d", *p);
*p=1 //等价 a=1
(1)& 取地址运算符,&a是变量a的地址
(2)* 指针运算符(或称 “间接访问” 运算符),*p代表指针变量p指向的对象
4.指针变量作为函数参数
void swap(int *p1,int *p2); //声明
swap(pointer_1,pointer_2); //调用
5.通过指针引用数组
(1)数组元素指针就是数组元素的地址
int *p;
p=&a[0];
等价于
int *p=&a[0];
(2)数组元素的指针运算
指针加一个整数(+或+=) 如:p+1
指针减一个整数(用-或者-=)如:p-1
自增运算,如 p++,++p
自减运算,如 p--,--p
p+1指向同一个数组中的下一个元素
p-1指向同一个数组中的上一个元素
(3)数组的引用方式
(1)下标法 a[i]
(2)指针法 *(a+i)或 *(p+i)
(4)用数组名做函数参数
实参类型 | 变量名 | 数组名 |
要求形参的类型 | 变量名 | 数组名或者指针变量 |
传递的信息 | 变量的值 | 实参数组首个元素的地址 |
通过函数调用能否改变实参的值 | 不能改变实参变量的值 | 能改变实参数组的值 |
int sort(int * p,int n);
// 等价于
int sort(int a[],int n)
// 调用
int *p,a[10];
p=a;
sort(a,2);
sort(p,2)
6.通过指针引用多维数组
表示形式 | 含义 | 地址 |
a | 二维数组名,指向一维数组a[0],即是0行首地址 | 2000 |
a[0],*(a+0),*a | 0行0列元素地址 | 2000 |
a+1,&[1] | 1行首地址 | 2016 |
a[1],*(a+1) | 1行0列元素a[1][0]的地址 | 2016 |
a[1]+2,*(a+1)+2,&a[1][2] | 1行2列元素a[1][2]的地址 | 2024 |
*(a[1]+2),*(*(a+1)+2),a[1][2] | 1行2列元素a[1][2]的值 | 元素值为13 |
用指向数组的指针作为函数参数
void search(float (*p)[4],int n);
一维数组有4个元素,因此p的基类型是一维数组,其长度为16字节