[b]1.宣告定義與記憶體分配[/b]
1.1乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分
(1)棧區(stack)—由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。
(2)堆區(heap)—一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。
(3)全域性區(靜態區)(static)—全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後由系統釋放。
(4)文字常量區—常量字串就是放在這裡的。程式結束後由系統釋放。
(5)程式**區
1.2通過*宣告的話是將指標存放在棧區域,具體指標指向的值可以在常量區,全域性區或者堆上。
通過宣告的話是將整個陣列存放在棧區域,並且宣告變數指向自身,即陣列的第乙個元素。
看乙個一維陣列的例子
#include
using namespace std;
main()
執行結果
2293628 4199056 abc
2293624 2293624 abc
2293620 4012976 abc
1.3如果用方式宣告變數的話可以用{}來定義,比如char a=,但是用*宣告的則不可以。因為這種方式是陣列的獨特定義方式。
[b]2.二位陣列[/b]
以上是一維陣列的例子,我們再來看看二維陣列
2.1宣告
可以把這樣宣告的乙個二維陣列看作乙個一維陣列來看。陣列的所有元素全部在棧區。
(1)首先,不可以用char a或者char a[3]宣告陣列,報錯為array type has incomplete element type 即,第二維的陣列的型別不明確。
(2)可以這樣宣告 char a[3],但是宣告的時候必須要為其賦初值,這樣編譯器才知道要為該陣列在棧中分配多大的空間。
如下例:
#include
int main()
;printf("%c",*((char*)x));
printf("%c",*((char*)x+1));
printf("%c",*((char*)x+2));
printf("%c",*((char*)x+3));
}
執行結果為1234
(3)可以這樣宣告 char a[3][3],這個是最標準的二位陣列宣告,二位陣列可以當作一維陣列,通過指標來取值,如上例。
2.2*組合宣告
(1)char *a,這樣的宣告代表a是乙個陣列,陣列每個元素是乙個指標。如果中沒有具體值的話,就需要賦初值,和char a[3]的情況是一樣的。因為char a[3]代表乙個陣列,陣列中每個元素都是乙個長度為3的陣列。
(2)char (*a),這樣的宣告代表a是乙個指標,指向乙個陣列,這裡的可以沒有具體值,但是這樣的情況棧中只存放乙個指標,其他所有值在堆中。
2.3**宣告
char **a 就是乙個指向指標單元的指標,棧中只存放乙個指標。
[b]3.函式傳值[/b]
在函式傳值的時候,如果是要傳乙個二維陣列的話,在函式的形參宣告中最好的方式是char (*a)[3],如果用char **a進行形參宣告的話會出現錯誤,因為形引數組無法識別第一維的大小,必須要在形參中宣告第一維的大小。
C語言中 和
在c語言中,每個變數都是乙個記憶體位置,並且每個記憶體位置都定義了其位址,可以使用 運算子 進行訪問,該位址表示記憶體中的位址。a指標是乙個變數,其值是另乙個變數的位址,即儲存位置的直接位址。像任何變數或常量一樣,你必須在使用指標儲存任何變數位址之前宣告乙個指標。int ip pointer to ...
C語言中 和 用法
一 基本的用法 1 引數名以 作為字首則結果將被擴充套件為由實際引數的帶引號的字串。如 12 3456 78 define dprint expr printf expr d n expr intmain 上面的例子會列印出 a b 2 2 預處理器運算子 為巨集提供了一種連線實際引數的手段。如果替...
c語言中「 」和「 」區別
乙個豎槓 表示運算的或 二個豎槓 表示邏輯的或 c語言的位運算 取反,0取反是1,1取反是0 是左移,比如1 右移,類似左移,數值大小除以2的n次方 按位與,1與任意數等於任意數本身,0與任意數等於0,即1 x x,0 x 0 按位或,x y中只要有乙個1則結果為1 按位異或,x y相等則為0,不等...