像char a[10]這樣的陣列,到底a是什麼呢?
學過c++的都知道,a是乙個位址。
但是為什麼我們cout《這個問題困擾了我很久,終於下決心把它刨根問底。
由於是直接學習c++,因此c語言的低階操作接觸得較少。經過兩天的網上資料查詢,終於發現,並且可以確定,a,其實就是乙個位址!
不同於指標。我們知道,指標有它所指向的位址——也就是它的值。並且它自己也有乙個位址。(可以用&號取)。但是陣列不一樣!,a本身就是乙個位址!這就是最根本的地方!也就是說它沒有第2層含義,也沒有什麼本身、和所指向的位址之間的區分!這就是一直困惑我的東西!它不是指標!!
那為什麼我們可以寫cout《那為什麼兩個句子都正確,又輸出不同的結果呢?——這是c++的優化!它把前者解釋成輸出a記憶體區域的內容,後者解釋成a的位址!
由於沒有學習過c語言,因此也不知道更多格式化的操作。今天終於找到例證證明這個結論。
char *p;int *p1;
int a[10]=;
char str="mengfan";
p=str;
p1=a;
printf( "%x" , p); /*輸出的是位址*/
printf("%s",p); /*輸出的是字串mengfan*/
printf("%x",p1);輸出的是位址
printf("%s",p1); /*輸出的是字串,亂碼*/
p,p1中存放的應為字串,但在輸出時還要兼顧前面的輸出格式符的控制,如果
是%s,則會在p的位址內的資料輸出,而不再輸出p本身的內容位址
printf("%c",p);//會輸出字串的第乙個字母m
printf("%d",p1);//會輸出陣列的第乙個數字
所以 p,p1離存的都是位址,在用%c,%d時都能作為首位址輸出第乙個字母或陣列元素,
但是如果換用,%s,輸出字串,在乙個位址空間內是不能存在字串的,所以編譯器
會認為是連續空間內的字串,所以就輸出了字串。
printf("%x",a);用這個語句我就可以得到a的位址,也就是cout<<&a;而cout<
陣列名和陣列名取位址
在c中,在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量 也就是陣列第乙個元素的位址。它的型別取決於陣列元素的型別 如果它們是int型別,那麼陣列名的型別就是 指向int的常量指標 在以下兩種場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符 的運算元時。siz...
陣列名和陣列名取位址
1 int a 10 2 int p a 3 int q 10 a 第二個為指向陣列的指標.a只是a 0 的位址,a 1就是a 1 的位址了,a是整個a 10 的首位址,是以整個陣列為角度來看,雖然它與a 0 的值相同,但是 a 1就已經增加了10個int型別的位元組的長度了.1 include 2...
陣列名和陣列名位址。
先不說啥,上 看 分析。是在vs2015下編譯的,debug 選的64 位。所以乙個指標占用 8個位元組。int main int argc,char argv int ca 6 printf n printf 主函式 n printf n printf 1.ca d n ca printf 2.c...