陣列名a代表乙個固定的位址,內涵在於其指代實體是陣列這種資料結構,可以理解為指標常量,但不是指標常量!(比如sizeof(a)等於5,而sizeof(指標)等於4),另外陣列名a不能用作左值;形參陣列名b是指標變數,在函式fun中可以用作左值。
陣列名a作右值時,a代表陣列首元素的位址,而&a代表整個陣列的首位址。這兩個值是相等的,但是意義不相同,在參與運算的時候有不同的表現。
陣列名傳入函式形參後,會失去本身常量的特性,變為乙個普通的指標。
如下**用於檢視陣列名的特性以及區別:
#include
void
fun(
char b)
//形參陣列名
intmain()
;printf
("%p %p\n"
, a, a +1)
;printf
("%p %p\n"
,&a,
&a +1)
;printf
("%d %d\n"
,sizeof
(a),
sizeof
(&a));
//a++; //報錯:表示式必須是可修改的左值
第二行printf:&a+1位址同樣會偏移,不同的是由於&a表示整個陣列的首位址,所以&a+1會偏移整個陣列大小的位址;
第三行printf:陣列名的sizeof值等於陣列所占用的記憶體位元組數;32位編譯器中,指標型別的變數或常量返回值通常是4(位元組)。
第四行printf:形參陣列名失去了陣列名的常量特性,可以自增自減。
指標陣列的一般定義方式類似char *p[10];
,p
優先和[ ]
結合,表示核心是陣列,這個陣列中儲存的內容全部是指標變數。指標陣列適合用來指向若干個字串,使字串處理更加方便,如果使用二維陣列來存,可能會因為字串長度不固定帶來記憶體單元浪費。常見的比如int main(int argc, char* ar**);
指標陣列初始化賦值有以下三種方式:
如下**演示如何將指標陣列傳遞給函式形參,以及函式如何獲取指標陣列的值:
#include
void
fun(
char
**pt)
intmain()
;//定義乙個指標陣列
char *p
定義方式,還可以使用char **p
定義方式,效果一樣。
陣列指標的一般定義方式類似char (*p)[5];
,p
優先和*
結合,表示核心是指標,這個指標指向的是乙個陣列。
定義乙個陣列指標,賦值為陣列名,然後檢視陣列指標的運算性質:
#include
intmain()
;char
(*p)[5
];//定義乙個陣列指標
char (*p1)[5];
和char *p2;
的區別:
C 陣列名與指標
1.緣起 由乙個題目引起的 問下面 輸出的是什麼?const char psz hello world int iarr cout sizeof psz endl cout sizeof iarr endl 前者輸出是4,輸出的是psz的型別大小,即指標型別佔4個位元組 在win32下 後者輸出是2...
陣列名與指標
引言 指標是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...