C語言之數組指針和指針數組
- 一、含義
- 二、定義
- 2.1 指針數組
- 2.2 數組指針
- 三、使用
- 3.1 指針數組在參數傳遞時的使用
- 3.1.1 指針數組的排序
- 3.2 數組指針在參數傳遞時的使用
一、含義
-
指針數組:顧名思義,其為一個數組,數組里面存放著多個指針,指針的類型可選。
-
數組指針:數組指針實質上就是一個指針,用”數組”修飾這個指針,意思是說這個指針存放著一個數組的首地址,或者說這個指針指向一個數組的首地址。
明白了吧,小伙子們。
二、定義
2.1 指針數組
char* (char_array[3]) = {"hello", "world", "GGBod"}; //擁有3個元素的數組,每個元素是一個char類型的指針,總大小為 3*4=12 個字節
int* (int_array[4]) = {1, 2, 3, 4};
struct Student* (struct_array[2]) = {{xxx} ,{xxx}};
上述括號可去掉,這里只是方便大家理解。
2.2 數組指針
char (*char_point)[3]; //這里的括號便不可去掉,用于指明這是一個指針
這里是一個指向一個擁有三個char類型元素的數組的指針,它指向數組的首地址,當執行 char_point++ 時,char_point會加3。
三、使用
3.1 指針數組在參數傳遞時的使用
- 指針數組常用在主函數傳參,在寫主函數時,參數有兩個,一個確定參數個數,另一個指針數組用來接收每個參數(字符串)的地址。
int main(int argc, char *argv[])
此時可以想象內存映像圖,主函數的棧區有一個叫argv的數組,這個數組的元素是你輸入的參數的地址,指向著只讀數據區。
- 如果是向子函數傳參,這和傳遞一個普通數組的思想一樣,不能傳遞整個數組過去,如果數組很大,這樣內存利用率很低,所以應該傳遞數組的首地址,用一個指針接收這個地址。因此,指針數組對應著二級指針。
void fun(char **pp); //子函數中的形參
fun(char *p[]); //主函數中的實參
3.1.1 指針數組的排序
#include "stdio.h"
#include "string.h"
void sort(char **pa, int n) // 冒泡排序
{int i, j;char *tmp = NULL;for (i = 0; i < n - 1; i++){for (j = 0; j < n - 1 - i; j++){if ((strcmp(*(pa + j), *(pa + j + 1))) > 0){tmp = *(pa + j);*(pa + j) = *(pa + j + 1);*(pa + j + 1) = tmp;}}}
}int main(void)
{char *pa[4] = {"abc", "xyz", "opq", "jiok"};sort(pa, 4);for (int i = 0; i < 4; i++){printf("%s\n", pa[i]);}return 0;
}
3.2 數組指針在參數傳遞時的使用
void fun(int (*P)[4]);//子函數中的形參,指針數組 a[3][4] = {0};//主函數中定義的二維數組
fun(a);//主函數調用子函數的實參,是二維數組的首元素首地址