闲话少叙,我们继续一起探寻指针吧!
目录
指针访问数组:
数组的理解:
我们学数组时,便了解到单独一个数组名表示首元素的地址,果真如此吗?其实有两个小小的特例;我们学习“ sizeof() ”它便可以计算数组的大小,我们可以来观察一下一个现象,探寻这个语境下的意思!
这好像有点差强人意了,它似乎并不表达为首元素的地址,否则运行结果为4,既然结果为20,20=5x4,所以这时的数组表示整个数组的大小!
还有一个特例“&数组名” ,它表示的整个数组的地址,我们可以用%p去观察效果;
除此之外,都表示为首元素的地址哦!
指针访问:
*p可以取出一个数组元素进行访问,但我们不禁好奇访问整个数组又该怎么办好呢?在指针第一篇文章开头便说数组就是指针,弄清指针之前,我们一起回忆一下数组的打印吧!
数组的打印我们用到了for循环,还有一个关键arr[ i ]; for循环的效果与数组使用时有异曲同工之效,关键在于如何用指针表示arr[ i ]; 我们假设指针为p, p相当于arr,p[ i ] = arr[ i ];运行一下是否与我们猜想一致
果真符合,但人不常用这种写法,而是*( p + i ),这种写法我们该如何理解呢?我们由内而外分析 p + i 相当于我们上篇文章所讲指针+整数,i每次加1相当于向后移动4个字节,来到下一个元素的地址,我们在分析外层,* 相当于给里面的地址解引用,从而得到元素。
数组和指针传参:
数组和指针相互转换,那传参时我们传递的是首元素的地址还是整个数组的地址,亦或是其他呢?接下来我们用一个例子探讨一下!
数组传参时会弱化为指针,sizeof()计算的则是指针的大小,指针的大小在x32占4个字节,而在x64占8个字节,sizeof(arr[0])算的是int类型的大小不变为4;所以在x64环境下 sz2=2 哦!
冒泡排序:
根据上述传参,当我们冒泡排序时,计算sz长度不可在函数中进行,我们可以传递两个参数传到函数中,如下所示:
二级指针:
指针变量又能存在那里呢?我们接着用数组打比方,二维数组相当于多个一维数组,这时我们奇思妙想一下会不会有二级指针呢? 如果有它长啥样?它又怎样进行存储呢?
二级指针存储和访问:
*pa可以解引用找到a,举一反三,**ppa则通过一次解引用找到pa,在解引用找到a!
指针数组:
指针数组的概念:
指针数组是什么呢?我们类比一下概念整型数组——存放整型的数组,字符数组——存放字符的数组,顾名思义,指针数组——存放指针的数组。
eg: int*arr[],那它的元素类型为int*类型!
指针数组模拟二维数组:
我们继续回忆一下二维数组的打印,两个for循环,arr[i][j];前面说到二维数组虽不等同于多个一维数组,但可以用多个一维数组模拟,如图所示:
int arr1,arr2,arr3都属于int*类型,而指针数组的元素类型则为int*,所以可以模拟二维数组哦!
结语:
很高兴能继续写文章与你们雅俗共赏!