指針數組
數組是一種類型的數的集合
整型數組的元素都是int類型
指針數組的元素都是指針變量
int* arr1[10];//整型指針的數組
char*arr2[10];//一級字符指針的數組
char** arr3[5];//二級字符指針的數組
參考這一份示意圖
示例1:定義多個字符指針
在上一站的字符指針里面,提到了可以直接用指針來創建一個常量字符串
同理,我們可以將多個指針放在一塊,湊成指針數組,一次性創建多個指向常量字符串的指針
int main()
{
char* arr[] = { "abcdef", "qwer", "zhangsan" };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%s ", arr[i]);
}
return 0;
}
示例2:存放數組名的數組
在之前的學習中,我們知道:數組名代表數組首元素的地址
可以說,數組名本質上也是一個指針
既然是指針,就能放進指針數組里面
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
int* arr[] = {arr1, arr2, arr3};
//arr是指針數組
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);//*(*(arr+i)+j)
}
printf(" ");
}
return 0;
}
這串代碼中,我們需要了解的是arr[i][j]和*(*(arr+i)+j)之間的關系
以下內容若有錯誤,還請大家在評論區指正!
arr[i][j]和*(*(arr+i)+j)
它們都是訪問數組的形式,用到了不同的操作符
但表達的含義相同:下標為i、j的元素
在內存中,數據的存儲是連續的
創建一個二維數組,可以看到兩行的數據是連續存放在數組里面的
int arr4[2][2]={{1,2},{3,4}};
既然是連續的,我們就可以用指針++的形式來訪問二維數組里面的所有元素
*(arr+i)指向第i行元素
*(arr+i)+j指向第i行下標為j的元素的地址
*(*(arr+i)+j)再次解引用,得到j元素
數組名的本質是地址,是該數組首元素的地址
二維數組的首元素是第一行,數組名arr就是第一行的地址
我們可以把二維數組的每一行理解為獨立的一個一維數組
這時候,二維數組的形式和上述代碼中int* arr[]數組的形式就相同了
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 };
//arr1 arr2 arr3是二維數組里面的每一行
int* arr[] = {arr1, arr2, arr3};
//arr等價于一個二維數組,但有不同
int* arr[]和二維數組的不同
int*arr數組里的元素arr1,arr2,arr3的地址是連續存放的
這里設計到一個新概念:數組指針
將在下一節講解!
但是它們對應的各自的數組內數據并不連續
如:arr1和arr2這兩個數組各自元素的地址并不連續
示例3:存放二級指針的數組
既然一級指針可以放進數組里,二級指針也是指針,同樣也能塞進數組里
下面這串代碼里面的arr2就是一個存放二級指針的數組
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
int** arr2[4] = {pp};
return 0;
}
你學會了嗎?下次給大家分享數組指針哦!
審核編輯:湯梓紅
-
指針
+關注
關注
1文章
481瀏覽量
70610 -
數組
+關注
關注
1文章
417瀏覽量
26028
原文標題:【C語言】指針進階第二站:指針數組!
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論