陣列名和陣列位址的關係

2021-04-25 17:15:13 字數 1085 閱讀 7042

像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...