陣列在記憶體中以順序的形式存放,陣列的第乙個儲存單元的位址即陣列的首位址。對一維陣列來說,直接引用陣列名就能獲得該陣列的首位址。指標變數可以存放於其內容相同的陣列首位址,也可以指向某一具體的陣列元素。通過這種方式,多維陣列也被看作一維陣列來操作,簡化了陣列的操作方式。
4.6.1 指標 與 一維陣列
定義一維陣列後,可定義乙個與其型別相同的指標變數指向該陣列。如:
int i[10] = , *pi; // 定義整型陣列 i 和整型指標變數 *pi
pi = i; // 將指標變數 *pi 指向陣列 i 的首位址
這樣 *pi 就指向了陣列 i 的第乙個單元,該賦值操作等同於 「pi = &i[0]」,pi 與陣列 i 的關係型如圖 8.7 所示。如果對指標內的位址進行運輸,指向「pi +=4」,則 pi 的指向關係隨之發生改變,如圖 8.8 所示。
因此,可以將 c 語言指標指向一維陣列的方法總結為以下 3 條:
(1)、「pi + n」或「i + n」表示陣列元素 i[n] 的位址,即「&i[n]」。陣列 i 有 10 個元素,n 的取值為 0 至 9,則陣列的位址可表示為「pi + 0」至「pi + 9」,或「i + 1」至「i + 9」,與 &i[0] 至 &i[9] 的作用一樣;
(2)、知道了陣列元素的位址表示方法,「*(pi + n)」;
(3)、指向陣列的指標變數也可用陣列的下標形式表示為 pi[n],其效果相當於「*(pi + n)」。
4.6.2 指標 與 二維陣列
二維陣列和其他多維陣列都能看作一維陣列進行指標操作 。如下例所示:
int i[2][5] = , *pi; // 定義整型二維陣列 i 和 整型指標變數 pi
pi = i[0]; // 將指標變數 pi 指向陣列 i 的首位址
該陣列可以視作乙個**,陣列 i 與 pi 的關係如圖 8.9 所示。如果要訪問其中的元素 i[1][2],則可用公式 1 x n + 2 得到該元素的位置,引用時可寫作 「*(pi + 1 * n + 2)」。
二維陣列的每一行都有乙個首位址,如 i[0] 代表 &i[0][0] 的位址,i[1] 代表 i[0][0] 的位址。因此,二維陣列也可以看作是 m 個長度為 n 的一維陣列,引用二維陣列需要將每行的首位址賦給指標變數。如下例,用指標修改二維陣列內的元素。
#include #define m 2 // 定義常量 m,用作二維陣列的行數
#define n 4 // 定義常量 n,用作二維陣列的列數
int main }
printf("陣列內的數值是:");
for (i = 0; i < m * n; i++)
return 0;
}
該**首先將陣列 a 的第一行首位址賦值給整型指標變數。第一組迴圈使用陣列行和列的關係計算陣列元素記憶體中的位置,給陣列 a 的每個元素賦值。第二組迴圈通過指標變數 pa 間接引用陣列 a 內的元素,將所有陣列元素的陣列輸出。
4.6.3 指標 與 字串陣列
字元型指標變數指向字串陣列首位址後,該指標即可當作字串使用。字串處理函式通常根據字串結束符判斷該字串的長度,所以這些函式都會延字串首位址向後遍歷,直到找到字串結束符。下列用於簡單的字串輸入與輸出。
char c[20], *pc; // 定義字元型陣列 c 與 字元型指標變數 pc
pc = c; // 字元型陣列 c 的首位址賦給指標變數 pc
scanf("%19s", pc); // 通過 pc 間接引用陣列 c,為陣列 c 初始化
puts(pc); // 輸出 pc 所指向的字串
puts() 函式的作用是將字串無格式輸出,當 *pc 作為其引數時,會記憶體中將 *pc 所指向的位址開始,到字串結束符之間的字元輸出到終端。假如輸入的字串為「i love china!」,將**最後一行改為:
puts(pc + 2); // 輸出記憶體中從 pc + 2 開始,到字串結束符為止的字串
那麼,該程式的輸出為 「love china」,因為 puts()函式會跳過字串陣列的前 2 個字元開始處理。如果字元陣列中沒有字串結束符,則呼叫 printf() 或 puts() 輸出函式後程式會出錯(一直向後處理,輸出很多意向不到的字元,直到遇到值為 0 的記憶體塊)。如果字元型指標變數沒有初始化,如下例所示:
char *pc; // 字元型陣列 c 的首位址賦值給指標變數 pc
scanf("%s", pc); // 通過 pc 間接引用陣列 c,為陣列 c 初始化
這是一種非常危險的用法,因為 pc 的值不可知,pc 可能指向記憶體中的任意位置。將字串儲存到 pc 所指向的記憶體單元中,可能造成嚴重的系統錯誤。這種用法稱之為無源指標,在程式中應避免出現。 初學C語言2 5 指標陣列和陣列指標
區別 指標變數是乙個左值 可改變 左值lvalue 識別或定位乙個儲存位置的識別符號。左值必須是可改變的 陣列名是乙個位址常量 不可改變 舉例 使用指標呼叫陣列 計算字串長度 include include include pragma warning disable 4996 int main p...
C語言總結 4 指標和陣列
指標就是指標,指標變數在 32 位系統下,永遠佔 4 個 byte,其值為某乙個記憶體的位址。指標可以指向任何地方,但是不是任何地方你都能通過這個指標變數訪問到。陣列就是陣列,其大小與元素的型別和個數有關。定義陣列時必須指定其元素的型別和個數。陣列可以存任何型別的資料,但不能存函式。c 中的引用 1...
C語言基礎 C語言指標 5 指標和陣列
上一節,我們補充了一點關於指標的小知識,這次我們來講講指標和陣列 首先,我們來看乙個小例子 include int main int p p ages 0 printf p d n p return 0 輸出的結果 有些人看到後,知道是可以這樣子傳值,但如果我們把整個陣列的所有元素列印出來呢?我們應...