以字符串為例比較指針與數組的特性
1. 修改內容
字符數組a 的容量是6 個字符,其內容為hello\0。內容可變。
指針p 指向常量字符串“world”(位於靜態存儲區,內容為world\0),常量字符串的內容是不可被修改的。
char a[] = “hello”; a[0] = ‘X’; cout << a << endl; char *p = “world”; // 注意p 指向常量字符串 p[0] = ‘X’; // 編譯器不能發現該錯誤 cout << p << endl; char a[] = “hello”; a[0] = ‘X’; cout << a << endl; char *p = “world”; // 注意p 指向常量字符串 p[0] = ‘X’; // 編譯器不能發現該錯誤 cout << p << endl
;2. 內容復制與比較
不能對數組名進行直接復制與比較
數組… char a[] = "hello"; char b[10]; strcpy(b, a); // 不能用 b = a; if(strcmp(b, a) == 0) // 不能用 if (b == a) … // 指針… int len = strlen(a); char *p = (char *)malloc(sizeof(char)*(len+1)); strcpy(p,a); // 不要用 p = a; if(strcmp(p, a) == 0) // 不要用 if (p == a) // 數組… char a[] = "hello"; char b[10]; strcpy(b, a); // 不能用 b = a; if(strcmp(b, a) == 0) // 不能用 if (b == a) … // 指針… int len = strlen(a); char *p = (char *)malloc(sizeof(char)*(len+1)); strcpy(p,a); // 不要用 p = a; if(strcmp(p, a) == 0) // 不要用 if (p == a)
3. 計算內存容量
char a[] = "hello world"; char *p = a; cout<< sizeof(a) << endl; // 12 字節 cout<< sizeof(p) << endl; // 4 字節 char a[] = "hello world"; char *p = a; cout<< sizeof(a) << endl; // 12 字節 cout<< sizeof(p) << endl; // 4 字節
擴展知識:
1. 當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針
2. 一個指針變量既可以指向一個數組,也可以指向一個數組元素,若定義一個指針變量,並將數組的首址傳給指針變量,則該指針就指向了這個一維數組,這個操作就相當於將數組名或第一個元素的地址賦予這個指針變量。如:
int a[100];
int *a_pointer; //定義一個指針變量,指向整型變量
把 a_pointer 指向數組 a 的第一個元素,可用下面兩種的語句:
(1)a_pointer=&a[0]; //該語句將這個數組的第一個元素的地址賦值給指針變量
(2)a_pointer=a; //將數組名所代表的數組的首地址賦予指針變量