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
直接用string 定义一个字符串数组
string str[5]={"happy","wife","happy","life","haha"};
这样的程序很简单,但是使用指针的话更灵活,以上作为参考。