指针
1.前言
上次我们讲了初阶指针的部分内容,今天我们将讲完剩下的部分。
2.二级指针
- 概念
二级指针是用来存放一级指针的地址的指针。
- 语法结构
int*pa,其中 * 表示这个pa变量是指针,int表示pa指向的对象的类型是整形。
int * * ppa,其中靠近ppa的 * 表示ppa是个指针,int * 表示ppa指向的对象的类型。
类似地,三级指针,四级指针,……等的语法结构也是如此。
一般地,有多少个 * 就表示它是几级指针。 - 二级指针的解引用
已知,一级指针解引用访问到地址的内容,而二级指针解引用访问到一级指针的内容。
而对二级指针ppa解引用操作两次就可以访问到a,类似地,对三级指针就得解引用三次,四级指针就得解引用四次,……。但我们通常最多使用的是一级指针,偶尔用到二级指针,二级以上几乎看不到。
3.指针数组
首先,得清楚指针数组是数组还是指针?肯定是数组,后面我们学的数组指针才是指针。
- 指针数组的概念
类比于整形数组、字符数组,整形数组是存放整形的数组,字符数组是存放字符的数组,那么指针数组是存放指针的数组。 - 指针数组的形式
int a = 10,b = 20,c = 30,d = 40,e = 50
int *arr[5] = {&a,&b,&c,&d,&e};
数组的类型与数组元素的类型相同,都是int*。
- 例题
使用一维数组模拟一个二位数组。假设我们要模拟一个三行四列的二维数组。
int main()
{
int arr1 = {1,2,3,4};
int arr2 = {2,3,4,5};
int arr3 = {3,4,5,6};
int* arr = {arr1,arr2,arr3};
int i = 0;
int j = 0;
int rows = sizeof(arr)/sizeof(arr[0]);
int columns = sizeof(arr1)/sizeof(arr1[0]);
for(i = 0;i < rows;i++)
{
for(j = 0;j< columns;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0 ;
}
结果
思路
- 我们需要几行的二维数组就创建几个一维数组,且创建的一维数组规模要相同。
- 创建一个指针数组,数组的元素为各个一维数组的数组名。
- 根据指针数组的的每个元素来访问每个元素对应的数组。
疑惑
大家可能对arr[i][j]这个表达式感到疑惑。arr[i]表示访问下标为i的数组元素,而这个元素又恰好是数组名,也就是说我们可以把arr[i]看成一个整体(看成数组名),数组名加上[]和j,不就是访问下标为j的元素,就这样利用循环,我们可以访问到三个一位数组的每个元素,从而实现模拟二维数组。
总结
我们已经把指针的初阶部分讲完,已经可以完成简单的指针练习了,快去刷题吧!