天天看點

【 C 】指向數組的指針(數組指針)(行指針)

本博文内容參考:《c 和 指針》

本博文解決兩個問題,一是如何通路二維數組的行,以及元素;二是如何定義指向數組的指針以及如何指派等。

很簡單,快速記錄!

先給出一個案例,判斷下面這兩個聲明以及指派合法嗎?

int vector[10], *vp = vector;

int matrix[3][10], *mp = matrix;

第一個聲明是合法的。它為一個整型數組配置設定記憶體,并把vp聲明為一個指向整型的指針,并把它初始化為指向vector數組的第一個元素。vector 和 vp具有相同的類型,都是指向整型的指針。也有差別,vp是指針變量,而vector是指針常量。

第二條聲明語句是非法的,這裡的非法是指對指針mp的指派是不正确的,聲明本身是沒有問題的。

它正确地建立了一個matrix數組,并把mp聲明為一個指向整型的指針。但是mp的初始化是不正确的,因為matrix并不是一個指向整型的指針常量,而是一個指向整型數組的指針。(它指向matrix數組的第一個元素,而這個元素又包含10個元素,更确切地說,也就是matrix指向該數組的第一行,也就相當于一個一維數組。)

我們怎麼樣聲明一個指向整型數組的指針呢?

int (*p) [10];

這個聲明作為一個重新撿起c語言的人來說應該是不難的,但是對于小白來說,肯定還是會吓出一身冷汗!

聲明也不是亂聲明的,肯定有它的道理,我們來分析下:

下标引用【】的優先級要高于間接通路*,但是括号的優先級最高,是以首先執行的還是間接通路。是以p還是一個指針,這個指針指向的是什麼呢?

接下來執行的是下标引用,是以p指向某種類型的數組。這個聲明表達式中并沒有更多的操作符,是以數組的每個元素都是整數。

聲明并沒有告訴你p是什麼?但推斷它的類型并不困難,當我們對它執行間接通路操作時,我們得到的是數組,對該數組進行下标引用操作得到的是一個整型值。是以說,這個指針是指向整型數組的指針。

在生聲明中加上初始化是這個樣子:

int (*p)[10] = matrix;

它使p指向matrix的第一行。

p是一個指向擁有10個整型元素的數組的指針。當你把p與一個整數相加時,該整數值首先根據10個整型值的長度進行調整,然後執行加法。是以我們可以使用這個指針一行一行地在matrix中移動。

如果你需要一個指針逐個通路整型元素而不是逐行在數組中移動,你該怎麼辦?

下面兩個聲明都建立了一個簡單的整型指針,并以兩種不同的方式進行初始化,指向matrix的第一個整型元素。

int *pi = &matrix[0][0];

int *pi = matrix[0];

增加這個指針的值使它指向下一個整型元素。