c++指針數組,int *,char *,string *

c++指針數組

指針數組≠數組指針,指針數組歸根結底是個數組,數組的元素是指針。數組指針歸根結底是個指針,指向數組的第一個元素。我們以int型、char型、str型指針數組爲例。

整型指針數組

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    int a[5]={1,2,3,5};
    int *pa[5];//定義一個指向整型數據的指針數組
    for(int i=0;i<5;i++)
    {
        pa[i]=&a[i];//取數組元素的地址賦給指針
        cout<<pa[i]<<setw(7)<<*pa[i]<<endl;
        //pa[i]輸出數組元素的地址,*pa[i]輸出數組元素的值
        //setw()標準輸出間隔控制函數
    }
    return 0;
}

需要注意的是,pa[i]輸出數組元素的地址,*pa[i]輸出數組元素的值。
運行以上程序,結果是:

0x7fff3fcf5350      1                                                                                                   
0x7fff3fcf5354      2                                                                                                   
0x7fff3fcf5358      3                                                                                                   
0x7fff3fcf535c      5                                                                                                   
0x7fff3fcf5360      0  

數組元素不夠時,c++會自動補0,如上述最後一行。

字符型指針數組

字符型和整型是很不一樣的

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    char b[5]={'h','a','p','p','y'};
    char *pb[5];//定義一個指向字符型數據的指針數組
    for(int i=0;i<5;i++)
    {
        pb[i]=&b[i];//取數組元素的地址賦給指針
        cout<<setw(7)<<pb[i]<<setw(7)<<*pb[i]<<endl;
    }
    return 0;
}

運行以上程序的結果爲

happy      h                                                                                                          
   appy      a                                                                                                          
    ppy      p                                                                                                          
     py      p                                                                                                          
      y      y

可見,pb[i]並沒有輸出b[i]的地址,而是把該指針所指字符及其後所有字符一併輸出,直到遇到\0停止。*pb[i]輸出的是具體字符。如果需要輸出b[i]每個元素的存儲地址,可以用下述指令:

cout<<static_cast<void *>(pb[i])<<endl;
0x7ffceadd9933
0x7ffceadd9934
0x7ffceadd9935
0x7ffceadd9936
0x7ffceadd9937

每個字符的存儲地址就會打印出來,並且可以發現,每個字符只需要一個字節的存儲空間。

字符串指針數組

可以用指針數組來保存一系列的字符串

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    char *pc[5]={"happy","wife","happy","life","haha"};
    for(int i=0;i<5;i++)
    {
        cout<<pc[i]<<setw(7)<<*pc[i]<<setw(13)<<static_cast<void *>(pc[i])<<endl;
    }
    return 0;
}

運行以上程序,結果如下:

happy      h     0x400b77                                                                                               
wife      w     0x400b7d                                                                                                
happy      h     0x400b77                                                                                               
life      l     0x400b82                                                                                                
haha      h     0x400b87

可以看出 pc[i] 輸出的是每一個字符串的值,因爲一個字符只佔一個字節,連續保存,自然連續讀取。
而 *pc[i] 輸出的是每個字符串的首字符; static_cast<void *>(pc[i]) 可以輸出每個字符串的首地址。如果要知道這個字符串數組中每個元素的長度(即包含幾個字符)和所佔內存的大小,可以用下述代碼:

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
    char *pc[5]={"happy","wife","happy","life","haha"};
    string str[5];//聲明一個字符串數組
    for(int i=0;i<5;i++)
    {
        str[i]=pc[i];//指針的長度不等於字符串長度,把指針所指的空間的內容賦給字符串數組
        /*cout<<pc[i]<<setw(7)<<*pc[i]<<setw(13)<<static_cast<void *>(pc[i])<<endl;*/
        cout<<str[i].length()<<setw(13)<<sizeof(str[i])<<endl;
        //使用<string>庫裏面的length()函數或size()函數都可以得到字符串長度
        //使用sizeof公式可以獲取每個字符串所佔的內存空間的大小,以我的電腦爲例,都是8.
    }
    return 0;
}

運行以上代碼,結果爲:

5            8                                                                                                          
4            8                                                                                                          
5            8                                                                                                          
4            8                                                                                                          
4            8

這裏要糾正一點,把指針賦值給字符串數組是會報出警告的,所以在輸出每個字符串所佔內存的大小時,全部輸出8,這並不代表每個字符串所佔內存空間爲8,反而是因爲把指針賦值給字符串數組,會把指針所佔的內存空間的大小給輸出,因爲指針所佔內存空間的大小等於電腦位數/8,以我的電腦爲例,是8個字節。
至於輸出字符串所佔內存的大小,期待後續補充。

直接用string 定義一個字符串數組

string str[5]={"happy","wife","happy","life","haha"};

這樣的程序很簡單,但是使用指針的話更靈活,以上作爲參考。

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