一丶二级指针
二级指针:存放一级指针的地址
格式:存储类型 数据类型 ** 指针变量名
例:int a = 3;
int *p = &a;
int **q = &p;//访问a的值:a **q *p
访问a的地址:&a p *q
访问p的地址:&p q
二丶指针和数组
直接访问:按变量的地址存取变量的值(通过数组名访问)
间接访问:通过存放变量地址的变量去访问变量(通过指针访问)
1. 指针和一维数组
int a[5] = {1, 2, 3};
int *p = a;
直接访问和间接访问:
注意:a和p本质上不同,a是地址常量,p是变量,a不能执行++操作,但是p可以
访问数组元素 a[i]的值:
直接访问:a[i] *(a+i)
间接访问:p[i] *(p+i)
访问数组元素 a[i]的地址:
直接访问:&a[i] a+i
间接访问:&p[i] p+i
2.指针和二维数组
a:数组名,表示第一行的首地址
a+1:第二行的首地址
在a前面*,表示将行地址降级为列地址
*a:第一行第一列的地址
*a+1:第一行第二列的地址
*(a+1):第二行第一列的地址
*(a+1)+1:第二行第二列的地址
直接访问:
int a[2][3] = {1, 2, 3, 4, 5, 6};
int *p = a; // 报错,两者的数据类型不同
如果想要对二维数组间接访问需要使用数组指针
3.数组指针
格式:存储类型 数据类型 (*指针变量名)[列数];
例:int a[2][2]={1,2,3,4};
int (*p)[2]=a;//定义一个数组指针p
p:第一行的首地址 p+1:第二行的首地址
p+1:移动8个字节(列数2*数据类型的大小)
p可以代替a进行元素访问,但是本质不同
数组指针的大小p:sizeof(数组指针名)(和操作系统有关:64----8 32----4)
4.指针数组
定义:本质上是数组,里面存放的是指针
格式:存储类型 数据类型 *数组名[元素个数];//int *arr[2];
应用实例:
(1).用于存储普通变量的地址
int a = 10, b = 20, c = 30;
int *p[3] = {&a, &b, &c};
访问b的地址:*(p+1) p[1]
访问 b 的值:*(*(p+1)) *p[1]
(2).用于存放二维数组的每一行第一个元素的地址(列地址)
int a[2][3] = {1, 2, 3, 4, 5, 6};
int *p[2] = {a[0], a[1]};
第二行第一列的地址:p[1] *(p+1)
第三行第二列的元素:*(p[2]+1) *(*(p+2)+1)
(3).用于存放字符串
char *p[3] = {"hello", "world", "shijie"};
打印shijie字符串:p[2] *(p+2)
打印j这个字符: *(*(p+2)+3) *(p[2]+3) p[2][3]
(4).命令行参数(int main(int argc,char const *argv[]))
argv:就是一个指针数组,里面存放的是命令行传递的字符串
argc:表示argv指针数组里面存放的数据的个数,即命令行传递字符串的个数