1.數組跟指針的區別
數組要么在靜態存儲區被創建(如全局數組),要么在棧上被創建。數組名對應着(而不是指向)一塊內存,其地址與容量在生命期內保持不變,只有數組的內容可以改變。
指針可以隨時指向任意類型的內存塊,它的特征是“可變”,所以我們常用指針來操作動態內存。指針遠比數組靈活,但也更危險。
數組和指針特點的簡單比較:
數組 | 指針 |
保存數據 | 保存地址 |
直接訪問數據 | 間接訪問數據,先取得指針的內容,然后以它為地址取得數據 |
用於存儲數目固定且類型相同的數據 | 通常用於動態數據結構 |
編譯器自動分配和刪除 | 動態的分配和刪除 |
自身即為數據名 | 通常指向隱式數據 |
(1)指針和數組都可以在初始化的時候賦予字符串常量。盡管看上去一樣,底層機制卻不同。
指針在定義的時候,編譯器並不會為指針所指向的對象分配內存空間,它只是分配指針變量的空間。除非以一個字符串常量對其進行初始化。下面的定義創建了一個字符串常量(為其分配了內存空間) char *p = "abcd";
在ANSI C中,初始化指針時所指向的字符串被定義為只讀,如果想通過指針修改字符串的時候,會產生未定義的行為。 數組也可以用字符串常量進行初始化,但是其內容可以被修改。
(2)內容的復制和比較不能對數組進行字節復制和比較,對於兩個數組a,b,不能用b=a進行復制,而應當使用標准庫函數strcpy()。也不能使用if(b==a)進行比較,應當使用strcmp()。 而對於指針p,如果要想將數組a中的內容復制,要先申請一塊內存區域,然后使用strcpy()進行拷貝。
void main(void ) {
char a[] ="hello";
char b[10];
strcpy(b,a); // can't use b=a;
if(strcmp(b,a) == 0);//can't use if(b==a)
char *p = NULL;
p = (char *)malloc(sizeof(char )*(strlen(a)+1);
strcpy(p, a);
if(strcmp(b,a) == 0);
}
(3)計算內存容量
用運算符sizeof()可以計算出數組的容量(字節數)。如下例
char a[] = "abcdef";
char *p = a;
sizeof(a) = 7;
sizeof(p) = 4;//sizeof(p) equal to sizeof(char *) =4
注意當數組名作為函數參數進行傳遞時,該數組自動退化該類型的指針,如下例:
void TEST(char a[100])
{
cout<<sizeof(a)<<endl;// in this place, sizeof(a) is equal to sizeof(char *) = 4
}
附:數組指針與指針數組
指針數組:首先它是一個數組,數組的元素都是指針,它的元素可以指向相同類型的不同對象,數組占多少個字節由數組本身決定。它是“儲存指針的數組”的簡稱。
數組指針:首先它是一個指針,它指向一個數組。在32 位系統下永遠是占4個字節,至於它指向的數組占多少字節,不知道。它是“指向數組的指針”的簡稱。
可參考:C語言指針數組和數組指針
函數指針與指針函數
函數指針就是指向函數的存儲空間地址的指針,可以對函數指針進行賦值並且通過函數指針來調用函數,它的本質是一個指針。
而指針函數只是說明它是一個返回值為指針的函數,其本質是一個函數。
2.指針和引用的區別