本貼發於csdn中的c語言討論區,現**於此,希望更多的人可以看到,寫的不錯。
主要是依據以下關於陣列名和指標互相轉換的道理:
(1)當乙個陣列識別符號出現在表示式中,這個識別符號的型別就從「某種型別t的陣列」轉換成「指向型別t的指標」,而且它的值就等於陣列第乙個元素的位址。並且這個指標是個常量指標,不可改變其值的。
(2)但是當陣列識別符號被用作sizeof和取址(&)操作的運算元時,sizeof返回的是整個陣列的大小,而取址操作返回的是指向陣列的指標(而不是指向乙個值為陣列頭元素位址的指標的指標)。
(3)既然陣列標示符在表示式中被「轉換為」指標用,那對於二維陣列又是什麼情況呢?對於乙個二維陣列如:int a[3][3], a是指向一維陣列的指標;當進行一次a[i]這樣的運算後所得到的值是乙個指標,其所指物件是乙個int型別,運算子的作用除了變址,還將乙個行指標變為乙個列指標;同理當進行一次&a[i]這樣的運算後所得到的指標又是乙個指向一維陣列的指標,即行指標。
inta[3]
=;char
**s;
charp[3
][5] =
,,};s =(
char
**)p;
printf(
"a: %p/n
", a);
//0012ff74:a在表示式裡被轉為int *,指向a[0]
printf(
"*&a: %p/n",
*&a);
//printf(
"&a: %p/n",
&a);
//printf(
"&a[0]: %p/n",
&a[0]);
//printf(
"a[0]: %p/n
", a[
0]);
//00000001:把a[0]的值以雙字的形式列印出來
printf(
"*a: %p/n",
*a);
////
所以*a其實就是a[0],所以結果同上一行。
printf(
"p: %p/n
", p);
//printf(
"&p: %p/n",
&p);
//printf(
"p[0]: %p/n
", p[
0]);
//0012ff60:p[0]是一維陣列的陣列名,出現在表示式中作為char *使用。
//printf(
"&p[0]: %p/n",
&p[0]);
//printf(
"p[1]: %p/n
", p[
1]);
//0012ff65:一維陣列名p[1]作為char *,指向p[1][0]。
//這個語句是要列印p[1][0]的位址,該位址等於p[0][0]的位址加5
printf(
"p[2]: %p/n
", p[
2]);
//0012ff6a:一維陣列名p[2]作為char *,指向p[2][0]。
//這個語句是要列印p[2][0]的位址,該位址等於p[1][0]的位址加5
printf(
"&p[0][0]: %p/n",
&p[0][
0]);
//printf(
"&p[1][0]: %p/n",
&p[1][
0]);
//printf(
"&p[2][0]: %p/n",
&p[2][
0]);
//printf(
"s的值: %p/n
", s);
//printf(
"s+1的值: %p/n
", s+1
); //
printf(
"*s: %p/n",
*s);
//63636261:s是char **,*s就是char*。
//因此這句意思是把s指向的記憶體取4個位元組(也就是p[0][0]到p[0]3)作為char*,列印其值。
printf(""
, s);
//printf(""
, s+
1);
//
陣列名與指標
引言 指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊...
陣列名與指標
include using namespace std int main int b 2 10 陣列名本身就是指標,再加上 就變成了雙指標,這裡的雙指標的就是指二維陣列 int p int a 1 p指向a陣列的第6個元素 雖然不存在 cout p 1 cout b 1 cout b 0 retur...
陣列名與指標
在本科畢業前,一直以為陣列名就是指標,但是最近看了一些技術文章和與一些技術大佬的討論,我開始迷茫了,在心裡一直有疑問,在本科寫程式的時候一直就拿陣列名當指標用啊,沒什麼問題啊,但是後來想了想,有了點靈感,就寫下來,不知道自己琢磨的是否通透,歡迎交流學習。首先說明陣列名為什麼不是指標 上例子 incl...