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

直接用string 定义一个字符串数组

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

这样的程序很简单,但是使用指针的话更灵活,以上作为参考。

上一篇:剑指offer32-III 从上到下打印二叉树(之字层序遍历二叉树)


下一篇:用队列实现栈python(leetcode225)