編譯器會把陣列名轉換為乙個指標常量,是陣列中的第乙個元素的位址,型別就是陣列元素的位址型別,如:
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...