课程内容:
指针的设计规则
指针的设计规则
本质
所有的指针都是用来保存地址的,只不过因为保存地址的数据类型不同,从而
拥有多种指类型.
规则
一级指针变量是用来保存普通变量的地址.
二级指针变量是用来保存一级指针变量本身自己的地址.
三级指针变量是用来保存二级指针变量本身自己的地址.
示例
以二级指针为例:
定义方式 如下:
数据类型 ** 变量名;
int a = 10;
int *p = &a;
int **q = &p;
指针的使用结论
在32bit的系统中,所有的指针变量都是4bytes
sizeof(指针变量)的大小
在32bit的系统中,多级指针(二级和二级以上)在移动的每次移动都是4bytes. 因为一个指针大小是4bytes
深入理解
一级指针 char q每次移动是去掉和q剩余类型大小也就是char普通类型大小为1bytes
二级指针或者多级指针 char *_q去掉_和q剩余类型是char *
char *是指针类型,指针类型大小都是4bytes
二级指针和一维数组的转换 int a[5] = {10,20,30,40,50}; int *p = a; int **q = &p; //q <===>&p *q <===>*(&p) *q<===>p 而根据一维数组得出结论: a[i] <===>_(a + i)<===>_(p + i)<===>p[i] 且当前 *q<===>p,故 *(p + i)<===>p[i]<===>_(_q + i) <===>(*q)[i]
指针数组
指针数组引言
5个int类型变量组成的数组,我们叫做整型数组. 例如:int a[5]
5个char类型变量组成的数组,我们叫做字符数组. 例如: char b[5]
5个 指针类型变量组成的数组,我们叫做指针数组.
int a[5]; //sizeof(a)
//a[0]~a[4] <===>int
//a<===>&a[0]
指针数组含义
它本质是一个数组,只不过该数组由多个指针来构成,所以,我们叫做指针数组。
每个指针中存放的都是地址值.定义一个指针数组等价于定义了多个指针变量。
指针数组定义方式
数据类型 *变量名[元素个数];
例如: int *p[5];
(1)数组中的元素: p[0] p[1] p[2] p[3] p[4]
(2)数组中每个元素的类型: int *
(3)整个数组的大小: sizeof§ ===>20bytes
(4)一个元素的大小: sizeof(p[0]) ===>4bttes
(5)元素的个数: sizeof§ / sizeof(p[0])
(6)数组的首地址: p<===>&p[0]
指针数组工程用法
int a = 10,b = 20,c = 30;
int *p_array[] = {&a,&b,&c,NULL};
int i = 0;
for(i = 0;p_array[i] != NULL;i++)
{
printf("%p\n",p_array[i])
}
二级指针保存指针数组地址
示例用法
char a = 10,b = 20,c = 30;
char *array[] = {&a,&b,&c,NULL};
array <====>&array[0];
array[0]的类型是char *
&array[0]应该定义char ** 的类型来保存。
故
========================================
char a = 10,b = 20,c = 30;
char *array[] = {&a,&b,&c,NULL};
//char **q = &array[0];
char **q = array; //q<===>array;
结论
针数组的首地址应该定义二级指针变量来保存
一维数组的特性 int a[5] = {10,20,30,40,50}; //整型数组 int *p = a; a[i]<===>*(a + i)<===>*(p + i)<==>p[i]
指针数组
案例
char a = 10,b = 20,c = 30;
char *array[] = {&a,&b,&c,NULL};
char **q = array; //q<===>array
数组的特点
获取地址的方法 array[i]<====>*(array + i)<===>*(q + i) <===>q[i] 获取数据的方法 *array[i]<====>*(*(array + i))<===>*(*(q + i)) <===>*q[i]
学习收获:
学习到了指针的设计规则,对指针和指针数组有了深入的了解
尤其是查看指针地址和指针数据这块,也更清晰了
截图打卡: