深入理解c語言陣列

2022-09-26 00:45:15 字數 2153 閱讀 9408

一 陣列名是什麼

陣列就是一段連續可用的記憶體。

比如宣告乙個 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...