指针和数组五连鞭,玩转cpp指针
本篇为b站的专题笔记,参考链接为
指针和数组的重难点解析
零、指针基础知识回顾
int a = 100; int *p_a = &a;
这里定义了一个int类型的变量a,它占用了地址为 0X11A(乱编的,仅示意)的内存存储了整数100。
在定义指针变量 p_a 的同时对它进行初始化,并将变量 a 的地址赋予它,此时 p_a 就指向了 a。值得注意的是,p_a 需要的一个地址,a 前面必须要加取地址符&
,否则是不对的。
注意:*号在定义时,和使用时,意义不一样
- 在定义时:表示定义一个指针变量,以和普通变量区分开,例如
int a = 100; int *p = &a;
。 - 在非定义时:表示获取指针指向的数据,例如
int a, b, *p = &a; *p = 100; b = *p;
一、 三维数组的偏移
题目:
解析:
&a 是a[0]的地址,&a+1是跨越整个数组指到数组后面一个位置的地址。
在第4行代码中,(int*)是强制类型转换。所以第4行意思是:定义一个int*类型的指针,他指向&a+1的地址。
*(a+1)指针指向的是2(a[1])
*(ptr - 1)是指向5(a[4])
所以最终输出的答案是 2, 5
题目:
解析:
数组是一块连续的内存,无论几维的数组,都可以看做一维数组。
*a指向二维数组,**a指向一维数组
由于a[2][2][3],所以作a+1时,相当于a[2][2][3] ,对蓝色部分操作
同理,*a+1就是下图:
最后输出答案是:7 12
拓展
输出答案是: 4 10
3 4
二、指针偏移
题目:
解析:
可以用画图清晰表示,绿色表示一级指针,浅蓝色二级,紫色三级。
字符串可以看作是一种特殊的数组,所以使用指针处理字符串的时候可以完全按照处理数组的方式来进行。字符串,比如s[0] = “black”本身就是一个指针,因此s是二级指针。
*p 内容是 s+2
**p 内容是 s[2]
**p + 1 内容是 ink
因此最后输出答案是:ink
后面三期视频难度太大,目前暂时不需要,以后需要再补上。