【C語(yǔ)言】指針進(jìn)階第三站,數(shù)組指針!
數(shù)組指針
整型指針:指向整型的指針
字符指針:指向字符的指針
數(shù)組指針:指向數(shù)組的指針

基本概念
下面哪個(gè)是數(shù)組指針呢?
指針數(shù)組和數(shù)組指針的概念很容易混淆,一定要分清楚哦!
p1是指針數(shù)組,每個(gè)元素的類型是int*
p2是數(shù)組指針,每個(gè)元素的類型是int(*)[10]
1.1、代碼示例
pp是一個(gè)數(shù)組指針,類型是int*(*)[6],存放的是int*類型的數(shù)組,該數(shù)組有6個(gè)元素

一般情況下,去掉變量名,剩下的即為變量類型
如:int* (*pp)[6]去掉變量名pp,變量類型為int*(*)[6]
pa也是一個(gè)數(shù)組指針,變量類型為char(*)[5],指向char類型的數(shù)組,該數(shù)組元素個(gè)數(shù)為5
1.2、錯(cuò)誤示范
你肯定會(huì)有一個(gè)疑問(wèn),變量類型為int(*)[5]的數(shù)組指針,能否指向數(shù)組元素為3或者6的數(shù)組呢?

程序能夠正常編譯,但是會(huì)報(bào)出如下警告
在正常編寫代碼的時(shí)候,我們還是得保證數(shù)組指針和原數(shù)組的元素個(gè)數(shù)一致!
arr和&arr的區(qū)別
在進(jìn)一步了解數(shù)組指針之前,我們需要了解arr和&arr的區(qū)別
當(dāng)我們用%p打印arr和&arr時(shí),會(huì)發(fā)現(xiàn)它們的結(jié)果是相同的

但這能說(shuō)明arr和&arr等價(jià)了嗎?
并不能!
再來(lái)看看下面這串代碼

arr+1跳過(guò)4個(gè)字節(jié),一個(gè)元素int的大小
&arr+1跳過(guò)40個(gè)字節(jié),整個(gè)數(shù)組的大小
其實(shí)&arr和arr雖然指向的地址值相同,但是意義不同!
&arr表示的是數(shù)組的地址,是int(*)[10]類型
arr表示數(shù)組首元素的地址,是int*類型
數(shù)組的地址+1,跳過(guò)整個(gè)數(shù)組的大小
所以&arr+1和&arr的差值為40
對(duì)應(yīng)的int(*p)[5]和int* p1也有不同
p接收的是&arr,整個(gè)數(shù)組的地址
p1接收arr,數(shù)組首元素的地址
數(shù)組指針的使用
3.1打印一維數(shù)組
下面這串代碼是用整型指針打印數(shù)組元素的情況

除了整型指針外,我們可以利用數(shù)組指針打印元素
*p等價(jià)于arr,arr+i等價(jià)于&arr[i],對(duì)arr+i解引用就是arr[i]

但是這種方式實(shí)際上是把簡(jiǎn)單問(wèn)題復(fù)雜化了:我們本來(lái)就可以用int*指針來(lái)打印數(shù)組元素,為何要利用數(shù)組指針來(lái)多此一舉呢?
所以在一維數(shù)組里面,我們一般不會(huì)這么寫
3.2、打印二維數(shù)組
假設(shè)我現(xiàn)在需要一個(gè)print函數(shù)來(lái)打印二維數(shù)組
在之前,我們一般會(huì)想到用這張方式傳入二維數(shù)組
當(dāng)我們想用數(shù)組指針的時(shí)候,情況就有些變化了
數(shù)組名是數(shù)組首元素的地址
二維數(shù)組的首元素是第一行
二維數(shù)組的數(shù)組名表示第一行的地址
這里prinf里面的arr就需要用數(shù)組指針來(lái)接收
該二維數(shù)組是3行5列,每一行都有5個(gè)元素,是一個(gè)int[5]的數(shù)組
對(duì)應(yīng)的數(shù)組指針為int(*)[5]類型
這里的p指針指向的是二維數(shù)組第一行的地址
*p:對(duì)p直接解引用
相當(dāng)于拿道了第一行元素的地址(把第一行看作數(shù)組,也就是數(shù)組的地址)
相當(dāng)于是二維數(shù)組第一行首元素的地址

對(duì)(p+i)解引用,就能拿到第i行第一個(gè)元素的地址
*(p+i)+j第i行第j個(gè)元素的地址
*(*(p+i)+j)第i行第j個(gè)元素
這一部分和上篇博客指針數(shù)組的內(nèi)容相似
最終的函數(shù)實(shí)現(xiàn)如下

4練習(xí):判斷
這一站最重要的就是區(qū)別指針數(shù)組和數(shù)組指針
4.1 int arr[5]
arr是一個(gè)整型數(shù)組,有5個(gè)元素,每個(gè)元素是int類型的
4.2 int*parr[10]
parr1是一個(gè)數(shù)組,數(shù)組有10個(gè)int*類型的元素
所以parr1是指針數(shù)組
4.3 int (*parr2)[10]
parr2和*結(jié)合,表示parr2是一個(gè)指針
去掉parr2即為它的變量類型int(*)[10]
所以parr2是一個(gè)數(shù)組指針
4.4 int(*parr3[10])[5]
[]的優(yōu)先級(jí)高于*
parr3先和[]結(jié)合,說(shuō)明parr3是一個(gè)數(shù)組
該數(shù)組有10個(gè)元素,每一個(gè)元素都是一個(gè)數(shù)組指針,類型是int(*)[5]
該數(shù)組指針指向的數(shù)組有5個(gè)int類型的元素

結(jié)語(yǔ)
第三站數(shù)組指針到這里就結(jié)束啦!
為了幫助大家,輕松,高效學(xué)習(xí)C語(yǔ)言/C++,給大家分享我收集的資源,從最零基礎(chǔ)開(kāi)始的,幫助大家在學(xué)習(xí)C語(yǔ)言的道路上披荊斬棘!
微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!大家也要把握住大學(xué)的時(shí)光,抓住成長(zhǎng)的每一次機(jī)會(huì)哦~
編程學(xué)習(xí)書籍分享:

編程粉絲交流:
