一 陣列名是什麼
陣列就是一段連續可用的記憶體。
比如宣告乙個 int陣列
int array=;
array代表什麼?有的資料說:陣列名是指向陣列首位址的常量指標。
下面我們可以驗證一下。
我都知道sizeof操作符可以返回乙個物件或者型別所佔的記憶體位元組數。
如:int i=1;
那麼sizeof(i) 的結果就是4(64位機器下的部分編譯器是8)
那我們列印sizeof(array)
printf("%d\n",sizeof(array));
結果是:12。
但是我們都知道sizeof(指標變數)==4的。
所有我們得出:陣列名不完全是指向陣列首位址的常量指標。
為什麼要用不完全,因為我們利用陣列來訪問陣列元素的時候。它又變得像乙個常量指標。
比如array[0]等效於*(array+0)
這時候 array就是乙個指向陣列首位址的常量指標,指標型別是指向陣列元素型別的指標。這裡就是 int*型別
我們可以這樣理解:
乙個大學的名字叫array。
有人問你array是什麼。你會告訴他array是大學,面積多少之類的。
但是有人問你去array怎麼走,你會告訴他array的校門(首位址)在**。
結論:陣列名其實代表的是乙個記憶體區域程式設計客棧,但是使用的時候變成了 指向陣列首位址的常量指標。
但是這裡還有乙個小陷阱:
複製** **如下:
#include
void foo(程式設計客棧int a)
int main(void)
; foo(array);
return 0;
}輸出的不是12,而是4。
出於效率的考慮,陣列傳參是引用傳參而不是拷貝傳參。因為陣列長度可能很大,拷貝乙份的話程式設計客棧太耗資源。
雖然我是這樣函式是這樣的
複製** **如下:
void foo(int a)
編譯器的眼中是這樣
複製** **如下:
void foo(int *a)
所以sizeof(a)是sizeof(指標變數)肯定是4;
二 字元陣列
首先我們看乙個簡單的程式
複製** **如下:
# include
int main(void)
輸出的結果是 def。
我們要知道c語言中只要用到了 "***xx",系統都會自動的把雙引號的內容新增到字元常量區。
注意:printf("***x");不會把"***x"新增到字元常量區。
複製** **如下:
char *str1="abc"; //會把 abc\0 新增到字元常量區,並把首位址賦值給str指標變數。
char str2="def"; //會把 def\0 新增到字元常量區,並且函式棧中新增乙個字元陣列 內容也是 def\0,str2指向的是棧中的陣列。
char str=; //只會在函式棧中新增陣列
由於字元常量區是連續的,所以
printf("%s\n",str1+4);
可以列印出str2的值。
三 二維陣列
int array[3]=;
前面我們已經說了,使用array訪問元素時,array就是乙個指標型別為指向陣列元素的指標型別,指向陣列首位址的指標。
二維陣列的元素就是陣列,
這樣寫就更容易理解:
int array[3]=,};
所有可以 這樣認為 array是這樣認為的
int (*const array)[3];
當我訪問陣列元素時候
array[x][y]在編譯程式設計客棧器看來就是 *(*(array+x)+y)
*(array+x) 得到的是乙個 第x行 型別為 「int[3]」(c語言沒有這樣的寫法) 的陣列,
陣列名在訪問元素的時候當做首位址指標來用,在這裡 *(array+x)等同於陣列名,
指標型別int *,指向的位址為 array+sizeof(int(*)[3])*x。
訪問這個陣列的第y個元素的時候,就要用 *(*(array+x)+y)。
這些就是我對c語言陣列的理解,如果錯誤的地方,謝謝指正,輕噴哈。
本文標題: 深入理解c語言陣列
本文位址:
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
C語言指標深入理解
前幾天看了乙個程式,裡面一段關於指標的 讓我非常糾結,看了很久才看懂,在這裡將將其記錄下來,希望能對大家有一定的幫助,先看示例程式 編譯器gcc include include include typedef struct list node list node,list,plist node st...