1. 程式人生 > >C++中char *和char []的區別

C++中char *和char []的區別

以前一直覺得這兩個有區別,但也沒深究,今天寫了個程式碼報了警告於是就看了看,總結如下。

例如如下程式碼:

#include<iostream>
using namespace std;
int main()
{
    char *p1 = "abcd";
    char p2[] = "1234";
    return 0;
}

這二者的區別還在於:
1. p1是一個指標變數,有一塊記憶體儲存它,它的內容是字串的地址,那麼我們要訪問字串就先要取出p1中儲存的地址,然後計算偏移量,進行訪問
2. 不同於p1,p2直接是字串的地址,直接訪問就行了

“abcd”是文字常量區分配了記憶體儲存的,棧上分配一地址給p1並指向“abcd”,那麼如果在後面的程式碼中改變了“abcd”,自然崩潰。所以,需要加上const限定

但是說到底,為什麼改變p1就是危險的,字元陣列的內容就能隨意改變呢?這是因為“abcd”是在編譯時刻就確定的,而“1234”是在執行時刻賦值的。所以,編譯器在編譯時就已經知道p1指向的是常量,他並不希望你改變,但是陣列不同,可以說他只是個儲存的工具,編譯器編譯時並不知道它裡面是什麼。

但在往後的存取中,在棧上的陣列比指標所指向的字串是要快的。

還網上找到如下程式碼,很詳細

int a=0;    //全域性初始化區
char *p1; //全域性未初始化區
main()
{
     int b;                  //棧
     char s[]="abc";  //棧
     char
*p2; //棧 char *p3="123456"; //123456\0在常量區,p3在棧上。 static int c=0; //全域性(靜態)初始化區 p2 = (char*)malloc(20); //分配得來得10和20位元組的區域就在堆區。 strcpy(p1,"123456"); //123456\0放在常量區,編譯器可能會將它與p3所向"123456"優化成一個地方。 }