心態崩了?int p[4];int (*p)[4];和int *p[4];三種數組定義詳解

三種定義數組形式的區別

  • int p[4];
  • int (*p)[4];
  • int *p[4];

初學C語言時,很難分清楚到底三者有何區別,尤其還涉及c語言的靈魂——C指針,下面,我將詳細介紹一下三種定義方式,希望對正困惑的你有所幫助。

1.分析第一種方式——int p[4];

我相信接觸過數組的,不管是任何所學的編程語言,這種定義應該最常見也最方便理解的吧。

1.1定義解釋

int p[4];表示定義了一個整型數組,數組名爲p(數組名錶示該數組在內存存放的首地址,故p爲數組的首地址),此數組有4個元素,並且每個元素也都是int類型,定義該數組會開闢sizeof(int) * 4個字節的連續存儲空間。

1.2數組在內存中的存放形式:

在這裏插入圖片描述

2.分析第二種方式——int (*p)[4];

這種定義方式經常與二維數組聯用

2.1解釋定義

int (*p)[4];表示p是一個指針變量,指向一個存放4個整型元素的一維數組,且p+1(或p-1)是向前(或向後)移動數組長度個字節的大小。其中,指針變量指向一維數組的指針變量,指向二維數組中的某一行。
而第一種方式的p+1(或p-1)是向前(或向後)移動int個字節的大小。

2.2該方式在與二維數組的聯用

設有如下二維數組:

int (*p)[4];
int a[3][4] = {
	{1,2,3,4},
	{5,6,7,8},
	{9,10,11,12}
};

利用指向由4(二維數組列數)個元素組成的一維數組的指針變量引用二維數組
在這裏插入圖片描述
當執行 p = a時,內存存儲情況變爲:
在這裏插入圖片描述
當 p ++ 時:
在這裏插入圖片描述
即 此時p[0][0] 的值等於a[1][0]的值爲5.

注:(*(a + i) + j)等價於 *(a[i] + j) 等價於a[i][j]*。
例如:(*(a + 1) + 2) =  *(a[1] + 2) = a[1][2]
	若:int (*p)[4];
		p = a;
	則:(*(p + 1) + 2) =  *(p[1] + 2) = p[1][2]

3.分析第三種方式——int *p[4];

這種定義方式等價於 int *(p[4]); 代表定義了一個指針數組,p是指針數組名,數組中的每個元素存放的是指向整型變量的指針(int * 類型)

3.1內存中的存放形式

在這裏插入圖片描述
和普通數組一樣,指針數組在內存中分配連續的存儲空間,指針數組也可以初始化。指針數組元素在使用時與同類型的指針變量相同。

3.2定義一字符型指針數組
char *name[] = {"Beijing","Hebei","Shanxi"};

則在內存中的存儲形式:
在這裏插入圖片描述

#include<stdio.h>
#include<string.h>

int main()
{
	char *name[] = {"Beijing","Hebei","Shanxi"};
	puts(name[0]); //輸出Beijing
	puts(*name);   //輸出Beijing

	puts(name[2]); //輸出Shanxi

	puts(*(name + 1));  //輸出Hebei
	return 0;
}

如果是 char * s = name[1]; puts(s + 3) 則輸出什麼?
我們繼續分析存儲情況:
在這裏插入圖片描述
故輸出:ei

講到現在,我相信你對這三種定義方式大概有所熟悉,其實難理解的主要就是指針操作。C語言的指針,可以使得程序更加簡潔、緊湊、高效。我們學習C語言的人,都應當熟練掌握指針操作,即使現在只是涉及入門內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章