當前位置:網站首頁>【C語言】指針進階第二站,指針數組

【C語言】指針進階第二站,指針數組

2022-01-28 03:06:42 慕雪華年


嘟嘟嘟,指針進階的第二站 指針數組到了!

上車上車!

回顧一下第一站的內容:字符指針


指針數組

數組是一種類型的數的集合

  • 整型數組的元素都是int類型
  • 指針數組的元素都是指針變量
int* arr1[10];//整型指針的數組
char*arr2[10];//一級字符指針的數組
char** arr3[5];//二級字符指針的數組

參考這一份示意圖

image-20220120163636123

示例1:定義多個字符指針

在上一站的字符指針裏面,提到了可以直接用指針來創建一個常量字符串

同理,我們可以將多個指針放在一塊,凑成指針數組,一次性創建多個指向常量字符串的指針

image-20220120165154597

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\n", 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("\n");
	}

	return 0;
}

這串代碼中,我們需要了解的是arr[i][j]*(*(arr+i)+j)之間的關系

以下內容,我的理解可能有偏差。若有錯誤,還請大佬們無情指正!


arr[i][j]和*(*(arr+i)+j)

它們都是訪問數組的形式,用到了不同的操作符

但錶達的含義相同:下標為i、j的元素

在內存中,數據的存儲是連續的

創建一個二維數組,可以看到兩行的數據是連續存放在數組裏面的

int arr4[2][2]={
    {
    1,2},{
    3,4}};

image-20220120171913223

既然是連續的,我們就可以用指針++的形式來訪問二維數組裏面的所有元素

  • *(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[]和二維數組的不同

int*arr數組裏的元素arr1,arr2,arr3的地址是連續存放的

這裏設計到一個新概念:數組指針

將在下一站講解!

image-20220120174138946

但是它們對應的各自的數組內數據並不連續

如:arr1和arr2這兩個數組各自元素的地址並不連續

image-20220120173916988


示例3:存放二級指針的數組

既然一級指針可以放進數組裏,二級指針也是指針,同樣也能塞進數組裏

下面這串代碼裏面的arr2就是一個存放二級指針的數組

#include <stdio.h>
int main()
{
    
	int a = 10;
	int* p = &a;
	int** pp = &p;
	int** arr2[4] = {
    pp};

	return 0;
}

結語

第二站的路程到這裏就結束了!

敬請期待下一站的數組指針航程吧!

如果你對博客內容有疑問,歡迎在評論區提出哦,萬分感謝!

版權聲明
本文為[慕雪華年]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280306415197.html

隨機推薦