C C C語言陣列名與指標

2021-09-24 18:54:59 字數 4036 閱讀 9939

int array[10];

int *p;
然後令:

p = array;

#include int

main();

int *p =array;

for(int i=0;i<10;i++)

printf("\n

");for(int i=0;i<10;i++)

printf("\n

");for(int i=0;i<10;i++)

printf("\n

");for(int i=0;i<10;i++)

printf("\n

");return0;

}

結果如下:

但是如果我們定義乙個多維陣列,如:

int arrays[2][2];

int *p;

p = arrays;

這樣p就指向了該多維陣列的首位址,由於多維陣列其實是陣列的陣列,所以多維陣列的首位址就是乙個地位的陣列的首位址,即arrays[0],它是乙個有2個元素的陣列。因此我們可以將一維陣列名賦值給int*型的指標,

#include int

main();

int *p =arrays;

for(int i=0;i<4;i++)

printf("\n

");return0;

}

結果如下:

可以發現,編譯時發生警告:

我們之所以可以通過p來遍歷arrays中所有元素,是因為,陣列本質上是按行優先儲存的。

我們可以通過兩次解引用獲取到陣列中的某乙個元素的值,有下式成立:

**arrays == *&arrays[0][0] == arrays[0][0]
如:

#include int

main();

int *p =arrays;

printf(

"%d == %d == %d\n

",**arrays,*&arrays[0][0],arrays[0][0

]);

return0;

}

結果:

對於多維陣列我們可以定義乙個指向多維陣列的指標:

int (*p)[2];

p = arrays;

這個括號是一定要加的,因為的優先順序比較高(?)。

比較 int *p[2] 和 int (*p)[2] :

因此我們知道 int (*p)[2] 與arrays有同樣的陣列結構,p就是arrays的乙個別名,我們可以通過p來實現任何arrays能實現的操作:

#include int

main();

int (*p)[3] =arrays;

for(int i=0;i<2;i++)

printf("\n

");}

return0;

}

結果如下:

陣列名和指標之間,經常會交替使用這兩個變數,例如把乙個指標當成陣列來使用,或者是把陣列名賦值給指標,通過指標來訪問陣列成員變數。

但是,陣列名和指標畢竟是定義不同的變數,它們之間也有一定的區別和聯絡。

理解陣列名和指標的區別和聯絡有助於我們正確使用c語言,即什麼情況下該使用陣列名,什麼情況下該使用指標。

區別1:

1)對於陣列名:

#include int

main();

printf(

"array = 0x%x\n

",array);

printf(

"&array[0] = 0x%x\n

",&array[0

]); printf(

"&array = 0x%x\n

",&array);

return0;

}

輸出結果如下:

我們已經知道,陣列名即陣列首元素的位址,因此array和&array[0]的值一樣,但是令我們驚奇的是,陣列名的位址&array和和陣列首元素的位址&array[0]也一樣。 

2)對於指標:

#include int

main();

int *p =array;

printf(

"array = 0x%x\n

",array);

printf(

"&array[0] = 0x%x\n

",&array[0

]); printf(

"&array = 0x%x\n

",&array);

printf(

"\np = 0x%x\n

",p);

printf(

"&p = 0x%x\n

",&p);

return0;

}

結果如下:

可以發現指標的值和指標所在的位址是不同的。

區別2:

陣列名是指標常量,指標是指標變數。

區別3:

當對陣列名使用sizeof時,得到的是陣列所有元素所佔的位元組數,對指標sizeof得到的是指標型別的位元組數。 

#include int

main();

int *p =array;

printf(

"sizeof array = %d bytes\n

",sizeof

(array));

printf(

"sizeof pointer = %d bytes\n

",sizeof

(p));

return0;

}

輸出如下:

區別4:

對陣列名取&和對指標取&的意義不同。 

#include int

main();

int *p =array;

printf(

"&array = 0x%x\n

",&array);

printf(

"&array + 1 = 0x%x\n\n

",&array + 1

); printf(

"&p = 0x%x\n

",&p);

printf(

"&p + 1 = 0x%x\n

",&p + 1

);

return0;

}

輸出如下:

上圖可以看到對array取位址後加一,增大了24個位元組,恰好是陣列的大小;而對指標p取位址後加一,只增大了8個位元組,恰好是乙個指標型別所佔的位元組數。

陣列名代表了乙個指向陣列首元素的指標常量,一經定義,不可更改;指標是指標變數,定義之後仍可更改,其型別在定義時確定。

當出現 sizeof 和 & 操作符時,陣列名不再當成指向乙個元素的指標常量來使用,而指標仍當成指向乙個元素的指標變數來使用。

對於使用指標和陣列下標的選擇: 

系統在使用陣列下標對數組成員變數進行訪問時,開銷比較大,指標的訪問效率是遠遠大於陣列名的訪問效率的;

但是只有在指標正確訪問時,使用指標才比下標法更有效率; 

下標法更加容易理解,在可讀性方面,也更加的具有優勢。

C C C語言陣列名與指標

int array 10 int p 然後令 p array include int main int p array for int i 0 i 10 i printf n for int i 0 i 10 i printf n for int i 0 i 10 i printf n for in...

C語言 陣列名與指標

以下內容 感覺對自己有用,收藏了。如果 請註明如上出處。多謝!看到一篇關於c語言指標的文章,正好最近在看 c和指標 就去看了一下。一道 c 語言指標訪存題目的引申 裡面的第乙個題目就把我難住了。幫助123456789 include int main int pa int a 1 printf x ...

陣列名與指標

引言 指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊...