深入理解指针(5)

目录:

1.二级指针

2.指针数组

3.指针数组模拟二维数组


1.二级指针

引入:

在C语言的学习中,我们知道,是变量就有地址,int a 中,a有地址,那int* p中,p的地址有吗?

肯定是有的,p是一个指针变量,是变量就有地址,那存放p地址的地方叫什么呢?


p作为指针变量,是专门存放地址的变量,那存放地址的变量的的地址,C语言称它为二级指针

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
}

这里的pp就是一个二级指针

接下来是讲解:我们在上几节课学到,int * p 的含义,*是在说明变量p是一个指针变量(存放地址的变量==指针变量),int 是在说明p所接受的地址指向的对象类型是int 型(即a是整型)

那int ** p 也是同样的道理,第二个*是在说明pp是一个指针变量,int *是在说明pp所接受的地址指向的对象类型是int *型

既然存在二级指针,那就会存在更高级的地址,比如存放二级指针地址的指针,也就是三级指针

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main()
{
	int a = 10;
	int* p = &a;
	int** pp = &p;
    int *** ppp = &pp;
}

这样就写出了一个三级指针,(回顾:除去变量名字剩下的就是变量类型)

*是在说明ppp是一个指针变量,int**说明ppp所指向地址的对象是int **型


二级指针解引用后为一级指针,一级指针解引用后为地址所指向的元素

所以二级指针解引用两次就是地址所指向的元素


2.指针数组

问:指针数组是指针还是数组?

答:可以类比,整形数组是存放整形的数组,字符数组是存放字符的数组,指针数组就是存放指针的数组

指针数组中每个元素都是用来存放指针的,例如:

这里,int * arr[5]就是指针数组,它存放了 a,b,c 的地址

指针数组的理解与指针不同,这里的arr[5]就是创建了5个空间大小的数组,int *是在说明这个数组所接受的地址类型是 int* 型的


我们在之前讲过,arr[0] 表示 *(arr+0),那岂不是我们用arr[i]也能打印出10,15,20

但是当我们打印出来后,我们会发现打印出来的是随机值,并不是我们想要的10,15,20,为什么?

我们之前说过,数组名表示首元素地址,许多人会误以为这里的 arr 表示的是a的地址,但其实arr表示的是a的地址的地址,也就是二级指针了

我们会发现两点

  1. a的地址与数组名地址不一样

  2. 数组名地址与首元素地址的打印值一样

这就说明这里的数组名其实是地址的地址,即二级指针


3.指针数组模拟二维数组

接下来是讲解:

这里arr4[i][j],并不能按照二维数组的观念解引用,这只是模拟二维数组的实现

因为arr4是数组名,所以arr4是一个二级指针,所以实现的其实是 *(*(arr4+i)+j)

arr4+i会跳过i个int *类型,而解引用后 +j ,则会跳过 j 个 int 类型

相关推荐
kingmax542120081 小时前
北京高一历史上学期期末考情分析与核心知识点精讲(完整版)-吐血整理-全网最全
笔记·学习方法·历史
scx201310041 小时前
20260112树状数组总结
数据结构·c++·算法·树状数组
星竹晨L1 小时前
【C++内存安全管理】智能指针的使用和原理
开发语言·c++
宵时待雨1 小时前
数据结构(初阶)笔记归纳3:顺序表的应用
c语言·开发语言·数据结构·笔记·算法
智者知已应修善业1 小时前
【C语言 dfs算法 十四届蓝桥杯 D飞机降落问题】2024-4-12
c语言·c++·经验分享·笔记·算法·蓝桥杯·深度优先
九成宫1 小时前
计算机网络期末复习——第4章:网络层 Part Three
网络·笔记·计算机网络·软件工程
玖釉-1 小时前
[Vulkan 学习之路] 09 - 显卡的流水线工厂:图形管线概览 (Graphics Pipeline)
c++·windows·图形渲染
whale fall2 小时前
【雅思听力语料库5.1】
笔记·学习
西西学代码2 小时前
aa---(9)
笔记
无限进步_3 小时前
【C语言&数据结构】二叉树遍历:从前序构建到中序输出
c语言·开发语言·数据结构·c++·算法·github·visual studio