關於C語言中數組的一些特性

C語言的數組是C語言中比較特殊的一種數據類型。這種數據類型由元素類型和元素個數共同決定。並且元素計數是從0開始到數字大小減去1。

數組名

數組名是數組的名字。在使用它的時候需要注意C語言中的規定。首先我們來看一維數組

#include <stdio.h>

int main()
{
	int num[10] = { 0 };

	printf("%p\n", num);
	printf("%p\n", (num + 1));
	printf("%p\n", (&num + 1));

	return 0;
}

先看運行結果。

結果表明num和&num在進行步進操作的時候完全不同。

00DDF7B8 ➖ 00DDF794 = 24(H) = 36(D)。

這裏的int類型佔據4個字節,也就是兩者差了9步。因此可以得出結論:

num+1步進了1步;&num+1步進了10步。

num代表得是數組首元素地址;

&num是整個數組的地址。

下面我們接着分析二維數組的數組名。

#include <stdio.h>

int main()
{
	int num[10][10] = { 0 };

        printf("%p\n", num);
	printf("%p\n", (num + 1));
	printf("%p\n", (&num) + 1);

	return 0;
}

運行結果如下:

008FF608 ➖ 008FF5E0 = 28(H) = 40(D).

008FF770 ➖ 008FF608 = 168(H) = 360(D).

這時候,二維數組名和一維數組又表現得不一樣了。

二維數組名num本身代表得是一個指針,只不過它是指向這樣一個類型:int *[10],而是不是int * [10][10]類型。

下面是測試:

#include <stdio.h>

int main()
{
	int num[10][10] = { 0 };
	int (*p)[10];		//定義一個數組指針
	p = num;                //指向num數組

	printf("%p\n", num);
	printf("%p\n", (num + 1));
	printf("%p\n", (&num + 1));

	printf("%p\n", p);
	printf("%p\n", (p + 1));
	return 0;
}

測試結果如下:

可以看到num這個數組名確實和p得表現確實一致。那麼誰和&num表現得是一致得呢?我們接着測試。

#include <stdio.h>

int main()
{
	int num[10][10] = { 0 };
	int (*p)[10];		//定義一個數組指針
	int(*p1)[10][10] = &num;    
	p = num;


	printf("%p\n", num);
	printf("%p\n", (num + 1));
	printf("%p\n", (&num + 1));

	printf("\n");

	printf("%p\n", p);
	printf("%p\n", (p + 1));
	printf("%p\n", (p1 + 1));
	return 0;
}

下面我們來看這個測試得結果:

可以看到,&num和p1得表現是一致得。這說明&num得實際是一個指向int * [10][10]得數組指針。

有了上面得結論,我們下面接着看數組作爲函數參數得問題。

數組做函數參數

數組做函數參數傳遞不是數組本身,而是數組地址。這樣能提高C語言得效率,並且能節省空間。一維數組做函數參數是非常簡單得,如下所示。

#include <stdio.h>

void fun(int* num)
{
	num[3] = 333;
}

int main()
{
	int num[10] = { 0 };

	fun(num);
	printf("%d\n", num[3]);
	return 0;
}

一維數組,我們這麼寫沒有任何問題,結果如下所示。

那麼二維數組得時候,我們由上面得分析可以得知,我們應當這麼寫:

#include <stdio.h>

void fun(int (*num) [10])            //二維數組做函數參數可以這樣傳遞
{
	num[3][3] = 333;
}

int main()
{
	int num[10][10] = { 0 };

	fun(num);
	printf("%d\n", num[3][3]);
	return 0;
}

結果如下:

這樣就是說二維數組做函數參數可以傳遞一個指向一維數組得指針;實際上多維數組全部都是這樣退化的。例如下面的三維數組。

 

 

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