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] = #
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;
}
結果如下:
這樣就是說二維數組做函數參數可以傳遞一個指向一維數組得指針;實際上多維數組全部都是這樣退化的。例如下面的三維數組。