指標 中 陣列指標,指標陣列,陣列傳參,指標傳參
1.指標陣列
指標陣列是一個數組,裡面每個元素是指標。
初始化如下
2.陣列指標
指向陣列的指標
形式如下int (*p)[5] 因為[ ]比*優先順序高,因此表示一個指標必須給*p帶上括號
賦初值如下
3.陣列指標的應用:
#include<stdio.h> #include<stdlib.h> void print(int arr[3][4], int x, int y) { int i= 0; int j = 0; for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; print(arr, 3, 4); system("pause"); return 0; }
上面的程式碼,運用陣列指標也可以寫成如下;
#include<stdio.h> #include<stdlib.h> void print(int(*p)[4], int x, int y) { int i = 0; int j = 0; for (i = 0; i < x; i++) { for (j = 0; j < y; j++) { printf("%d ", *(*(p + i) + j)); } printf("\n"); } } int main() { int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; print(arr, 3, 4); system("pause"); return 0; }
接下來我們思考寫一個數組,陣列有5個元素每個元素是一個指標,且指標指向一個有3個整形元素的陣列,也就是指向陣列的指標陣列
大家應該就寫成 int ( *)[3] arr[5],按理說是對的,但是不是如此規定應寫成 int ( *arr[5]) [3]
4.一維陣列傳參
以上引數形式都可以,我挑幾個講一下,
1.用陣列接收當然可以,裡面不用指定大小,因為一維陣列傳參時,形參不會真實建立一個數組,如果是變數值傳遞,那麼形參是實參份臨時拷貝,而陣列傳參時,形引數組不會來一次臨時拷貝,傳的是首元素地址,不會建立一個數組因此沒必要指定大小。
2.不指定大小都可以,指定了當然可以
3.傳過去地址,用指標接收當然可以
4.傳過去是指標陣列陣列名,用指標陣列結束接收可以
5.傳過去是指標陣列陣列名,代表首元素地址,首元素是個指標向陣列的指標,再取地址,就表示二級指標,因此用二級指標接收是可以的。
5.二維陣列傳參
1,2,顯然可以,注意裡面的3,5不能同時省略,只可以省略第一個引數3
3錯誤
4.傳過去二維陣列陣列名,代表陣列首元素地址,即第一行地址,第一行是個陣列,因此用一個數組指標接收,因此4也可以。
6.一維指標傳參 即當函式引數部分是一級指標時,可以接受什麼引數例如:test(int*p)
(1)可以是一個整形指標
(2)可以是整型變數地址
(3)可以是一維整型陣列陣列名
7.二維指標傳參 即當函式引數部分是二級指標時,可以接受什麼引數例如:test(int**p)
(1)二級指標變數
(2)一級指標變數地址
(3)一維指標陣列的陣列名
型別有很多,這只是一部分。
8.陣列,指標的宣告和定義
(1)宣告和定義針對同一塊空間
(2)陣列定義需要指定有幾個元素,宣告不需要。因為宣告不會建立空間