陣列要麼被建立在靜態儲存區(如全域性陣列),要麼被建立在棧上(區域性陣列)。陣列名對應著一塊記憶體,而不是指向一塊記憶體,其位址與容量保持不變,只有陣列的內容可以改變。
指標可以隨時指向任意型別的記憶體塊,其特徵是可變。因此經常使用指標操作動態記憶體塊,比陣列靈活,卻也更危險。
輸出分別是char *p="hello";//其實在vs2017裡邊,該指標不能這樣定義,而是const char *p="hello"才不會報錯。
,而應該使用標準庫函式cout《所以∗p*p
∗p指向常量字串,而對於以下**:
char p="hello";
p[0]="h";
cout《雖然p可以理解為乙個指向陣列首個元素的位址的指標,但是本質上對應著一塊記憶體,而不是指向一塊記憶體,內容是可以改變的。
陣列不能對陣列名直接比較,若想把陣列a的內容複製給b,不能使用語句b=a
strcpy
進行複製。比較a和b內容是否相同,不可以直接使用if(b==a)
,因為這樣比較的是位址,而內容的比較需要使用標準的庫函式strcmp()
char p = "hello";
char a[10];
strcpy_s(a, p);//a=p;編譯器會報錯
cout << a << endl;
if(strcmp(a,p)==0)cout<<"true"《指標
指標直接相等代表著兩個指標指向同乙個位址,如果指標a需要複製指標b的內容,需要先為指標a申請一塊記憶體,然後使用strcpy,strcmp等函式進行copy和比較
int len=strlen(b);
char *a=(char*)malloc(sizeof(char)*(len+1));
strcpy(a,b);
if(strcmp(a,b)==0)cout<<"true"
int p = ;
int a[10];
int *pp = p;
cout << sizeof(p) << endl;
cout << sizeof(a) << endl;
cout << sizeof(pp) << endl;
16,40,8
當陣列作為函式的引數進行傳遞時,該陣列自動退化成同型別的指標:
void func(char a[100])
int main()
//輸出是8,(32位作業系統輸出是4)
參考這篇寫的超級全面細緻(強烈推薦) C 探幽 指標引數
不要用return語句返回指向 棧記憶體 的指標,因為該內存在函式結束時自動消亡。char getstring void int main 區域性變數儲存在棧中,區域性變數的生命週期是有限的,函式退出的時候會釋放,所以這裡返回的指向棧的指標是危險的。改寫成如下示例 char getstring2 v...
指標與陣列的對比
陣列的位址與容量在生命期內保持不變,只有內容可以改變 指標可以隨時指向任意型別的記憶體塊.2 不能對陣列名進行直接複製與比較。如不能用語句b a,把陣列a的內容複製給陣列b.否則產生編譯錯誤.應該用strcpy,同理比較b和a的內容是否相同,不能用if b a 來判斷,應該用標準庫函式strcmp進...
C語言陣列與指標對比
前面兩篇博文分別介紹了陣列與指標的知識,本篇將主要介紹兩者的聯絡與區別。希望對初學者有所幫助。分別定義乙個陣列與乙個指標變數,如下 int sarr 10 char ptr abcdefghi 通過下標訪問 通過間接訪問運算子 訪問 指標是左值 除非宣告為const 其值可以更改,陣列名是右值,其值...