C++一些注意點之字符串與指針

C語言中有兩種方法可以存放字符串,但是它們卻有區別。本文是看看書上以及網上的一些博客然後總結一下,一孔之見。

(1)分配內存位置的區別

             char *p=“word”;//“word\0”被分配在字符串常量存儲區存儲區,所以如果對p[0]=‘x’是錯誤的。

             char str[10]="word\n";//“word\0”被分配在棧空間中的,所以如果p[0]=‘x’是沒有問題的。

注:在棧空間分配內存的變量,是不能用來做函數參數參數返回的。因爲在函數調用結束後,函數中的變量(棧空間分配)都被銷燬了,返回值是一個不確定的值。

(2)sizeof與strlen區別

例1:(字符指針沒有隱含數組長度的概念)

            char *p="wordlength";sizeof(p)=4,;//因爲p只是一個字符指針,它所指的區域存儲了字符串,但是編譯器指示將其當作指針處理;

            但是,如果strlen(p)=10;//strlen是一個函數操作,以'\0'爲標準去計算字符串的長度,'\0'沒有算進去

例2:(字符串隱含了一個字符串數組的長度概念)

           char p[20]="wordlength";sizeof(p)=20*sizeof(char)=20,;//因爲p是一個字符串,是一個數組,這是一個隱形長度的概念在裏面,但是如果當作函數時又退化爲指針。

            char p[]="wordlength";sizeof(p)=11;//p是一個字符串,一個數組,雖然沒有給出長度,編譯器會自動算出長度,這裏爲什麼是11,因爲在字符串的結尾有一個額外的'\0'。

           但是,如果strlen(p)=10;//strlen是一個函數操作,以'\0'爲標準去計算字符串的長度,'\0'沒有算進去。

           sizeof(*p)=1;//*p是第一個字符串的第一個字母

(3)字符指針可以指向一個字符串

            char *str=”china“;//C語言中對字符串常量按照字符數組處理的,在內存中開闢了一個字符數組來存放該字符串常量。對str的初始化,其實就是將把該內存中的第一個元素地址賦給了str。

            上面的定義可以拆成下面兩行:

                        char *str;

                        str = ”china“;//讓str指向china這個存儲空間

            但是不能這樣:

                         char *str;

                         *str=”china“;//str都沒有指向任何空間,這樣賦值顯然是不對的。

(4)用scanf的時候注意

例1: char str[10];

           scanf("%s",str);//這樣輸入時沒有問題的,在編譯的時候str已經分配了空間,其地址是確定的

例2: char *str;

           scanf("%s",str);//這樣是不對的,str沒有指向確定的空間,這樣是一個很危險的一個操作

(5)字符串的指針值是可以改變的

           char *str="china";

            str=str+1;//這是沒有問題的

           char c = *str ;//我們可以通過取地址操作獲得字符串的某個字符

           *str = ‘c’;//但是我不能修改str裏面的內容,因爲str指向的空間在字符串常量空間分配的,無法改變。

注:但是一般的數組名雖然代表地址,但它卻是常量,它的值是不能改變的。

(6)char *str = “lsj”;//不需要釋放內存

         char *str = new char[strlen(1)+1];//需要釋放內存

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章