c primer plus 復合型別之陣列

2021-10-09 21:56:34 字數 1032 閱讀 4216

編譯器會把陣列名轉換為乙個指標常量,是陣列中的第乙個元素的位址,型別就是陣列元素的位址型別,如:

int a[10] = ;

陣列名a若出現在表示式中,如int *p=a;那麼它就轉換為第乙個元素的位址,等價於int *p=&a[0];

只有兩種情況下例外:

第一種是對陣列名使用sizeof運算子

sizeof(a) :這將會得到整個陣列所佔的記憶體大小,a是長度為10個int(4位元組)陣列,運算結果是40。此時a代表的是陣列所占用的那一整塊記憶體。

第二種是對陣列名取位址

a 和 &a

雖然a 和 &a 的值是相同的。 

但是&a 中的a代表整個陣列,而不是指向陣列首元素的指標常量。 

「取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是乙個指向某個指標常量值的指標。

所以 a+1  和 &a +1 不是同乙個意義。 a+1  表示下乙個元素,&a +1 表示下乙個陣列。

陣列作為函式引數

陣列傳參時,會退化為指標。 型別是第乙個元素的位址型別。

(1)退化的意義:c語言只會以值拷貝的方式傳遞引數,引數傳遞時,如果只拷貝整個陣列,效率會大大降低,並且在引數位於棧上,太大的陣列拷貝將會導致棧溢位。 

(2)因此,c語言將陣列的傳參進行了退化。將整個陣列拷貝乙份傳入函式時,將陣列名看做常量指標,傳陣列首元素的位址。

陣列不能自增、自減運算。而指標可以。

二維陣列和函式

二維陣列作為函式的引數,

如int a[3][4] = ;

sum(a,3);

關鍵是sum申明的原型

sum(int (ar*)[4],int size);  // int (ar*)[4]表示的是陣列指標

或者是 sum(int ar[4],int size);

陣列初始化規則

1.只有定義陣列時才能使用初始化化,不能將乙個陣列賦給另乙個陣列。

只提供乙個用逗號分隔的值列表,並將它們用花括號括起來。初始化的值的數量可以少於陣列的元素數目,其他的預設設定為0.

《C Primer Plus》 復合型別

typename arrayname arraysize 要求arraysize在編譯是已知,不能是變數。陣列作為由基本型別組成的復合資料型別,arrayname要強調是對應基本資料型別組成的陣列 特定陣列 通過下標或索引單獨訪問各個元素 可能引發陣列越界的問題,int a 20 容易錯誤訪問a 2...

c primer plus復合型別之指標

指標是乙個變數,其儲存的是值的位址,而不是值本身。了解 在討論指標之前,我們先看一看如何找到常規變數的位址,只需對變數應用位址運算子 就可以獲得他的位置,例如 int cups 6 double donuts 4.5 cout cups value 程式輸出 cups value 6 and cup...

C primer plus 第4章 復合型別

1.陣列初始化 2.字串 兩種方式 c 風格字串 以 0結尾 string類庫 單引號表示字元常量 a 是字串編碼的簡寫,char a a 是正確的。但是 a 表示的是兩個字元a和 0組成的字串,實際上 a 表示的是字串所在的記憶體位址,因此char a a 是非法的 1 cin.getline a...