目录
15.二级指针
*定义
*演示
16.三级以及多级指针
*三级指针的定义
*多级指针的定义
17.指针数组
*定义
*代码
18.指针数组模拟二维数组
往期推荐
15.二级指针
*定义
之前讲的指针全是一级指针
int a = 1;
int *pa = &a;//一级指针
如果写成
int a = 1;
int *pa = &a;//pa是一级指针
int** ppa = &pa;//ppa是二级指针
二级指针定义:指向(存储)一级指针地址的指针
其实在这篇文章已经提前铺垫过了41.【C语言之外】聊聊Cheat Engine官方教程步骤6的思考
*演示
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 1;
int* pa = &a;//pa是一级指针
int** ppa = &pa;//ppa是二级指针
return 0;
}
命名的含义:ppa-->point pa-->point (point pa)
x86环境下,F11逐语句执行,运行到return 0;
打开监视窗口
现从&ppa查到&a
查看内存,输入&ppa
bc f8 8f 00 --倒着写-->00 8f f8 bc-->008ff8bc-->是&pa的结果
pa中存储着a的地址
c8 f8 8f 00--倒着写-->00 8f f8 c8-->是&a的结果
01 00 00 00--倒着写-->00 00 00 01-->是变量a的值
可以想到下面代码打印结果
printf("%d",**ppa);//二级指针需要两次解引用,因此要带两个*
就是a的值:1
16.三级以及多级指针
*三级指针的定义
类比二级指针,可以推出三级指针的定义:指向(存储)二级指针地址的指针(如int*** ppa=&ppa;)
*多级指针的定义
同理推出多级指针定义:n级指针是指向(存储)(n-1)级指针地址的指针
17.指针数组
*定义
回忆整型数组的定义:存放整型的数组
所以指针数组的定义:存放指针(地址)的数组
*代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 3;
int* arr[] = { &a,&b,&c };
for (int i = 0; i < 3; i++)
{
printf("%p\n", arr[i]);//打印指针数组
}
return 0;
}
DC-D0=C,D0-C4=C-->连续存放
18.指针数组模拟二维数组
*代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int arr1[] = { 1,2,3,4 };
int arr2[] = { 5,6,7,8 };
int arr3[] = { 9,10,11,12 };
//数组名即代表数组首元素的地址
int* arr[] = { arr1,arr2,arr3 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
*分析
上方代码并没有创建二维数组,但是却依靠指针数组模拟出二维数组,可以按照二维数组的形式(arr[i][j])来访问
注意:arr[i][j]等同于*(*(arr+i)+j)
(二维数组文章:13.5.【C语言】二维数组)
往期推荐
19.【C语言】指针(重难点)(A)
37.【C语言】指针(重难点)(B)
38.【C语言】指针(重难点)(C)
39.【C语言】指针(重难点)(D)
40.【C语言】指针(重难点)(E)