不知指针,让我带你一往而深 (二)

闲话少叙,我们继续一起探寻指针吧!

目录

指针访问数组:

数组的理解:

指针访问:

数组和指针传参:

冒泡排序:

二级指针:

二级指针存储和访问:

指针数组:

指针数组的概念:

指针数组模拟二维数组:

结语:


指针访问数组:

数组的理解:

我们学数组时,便了解到单独一个数组名表示首元素的地址,果真如此吗?其实有两个小小的特例;我们学习“ sizeof() ”它便可以计算数组的大小,我们可以来观察一下一个现象,探寻这个语境下的意思!

c2c4c7195ba9403d89d658751c01e370.png

c73866744a7744ddb90d536c20f11708.png

这好像有点差强人意了,它似乎并不表达为首元素的地址,否则运行结果为4,既然结果为20,20=5x4,所以这时的数组表示整个数组的大小!

还有一个特例“&数组名” ,它表示的整个数组的地址,我们可以用%p去观察效果;

除此之外,都表示为首元素的地址哦!

指针访问:

*p可以取出一个数组元素进行访问,但我们不禁好奇访问整个数组又该怎么办好呢?在指针第一篇文章开头便说数组就是指针,弄清指针之前,我们一起回忆一下数组的打印吧!

数组的打印我们用到了for循环,还有一个关键arr[ i ]; for循环的效果与数组使用时有异曲同工之效,关键在于如何用指针表示arr[ i ]; 我们假设指针为p, p相当于arr,p[ i ] = arr[ i ];运行一下是否与我们猜想一致

5db215b2bd444c98a8252dbd28f1ec6b.png

98057e27a73f4b6fbf43bcd26b697e6a.png

果真符合,但人不常用这种写法,而是*( p + i ),这种写法我们该如何理解呢?我们由内而外分析 p + i 相当于我们上篇文章所讲指针+整数,i每次加1相当于向后移动4个字节,来到下一个元素的地址,我们在分析外层,* 相当于给里面的地址解引用,从而得到元素。

数组和指针传参:

数组和指针相互转换,那传参时我们传递的是首元素的地址还是整个数组的地址,亦或是其他呢?接下来我们用一个例子探讨一下!

828721a47cd04818a85a71f70db66cef.png

74a54bc3c1fd4613b314195bd32e49dc.png

数组传参时会弱化为指针,sizeof()计算的则是指针的大小,指针的大小在x32占4个字节,而在x64占8个字节,sizeof(arr[0])算的是int类型的大小不变为4;所以在x64环境下 sz2=2 哦!

冒泡排序:

根据上述传参,当我们冒泡排序时,计算sz长度不可在函数中进行,我们可以传递两个参数传到函数中,如下所示:

0d3137eb7baa4d4f9c2c744cdf2eb55a.png

二级指针:

指针变量又能存在那里呢?我们接着用数组打比方,二维数组相当于多个一维数组,这时我们奇思妙想一下会不会有二级指针呢? 如果有它长啥样?它又怎样进行存储呢?

二级指针存储和访问:

e4e476543cfd4a17b98b567af1ee3f28.png

*pa可以解引用找到a,举一反三,**ppa则通过一次解引用找到pa,在解引用找到a!

指针数组:

指针数组的概念:

指针数组是什么呢?我们类比一下概念整型数组——存放整型的数组,字符数组——存放字符的数组,顾名思义,指针数组——存放指针的数组。

eg: int*arr[],那它的元素类型为int*类型!

指针数组模拟二维数组:

我们继续回忆一下二维数组的打印,两个for循环,arr[i][j];前面说到二维数组虽不等同于多个一维数组,但可以用多个一维数组模拟,如图所示:

f9e1cac4434041498fa6044b52524dd3.png

714f4cabff344b67bbf78f5753e4b531.png

int arr1,arr2,arr3都属于int*类型,而指针数组的元素类型则为int*,所以可以模拟二维数组哦!

结语:

很高兴能继续写文章与你们雅俗共赏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值