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"};
這樣的程序很簡單,但是使用指針的話更靈活,以上作爲參考。