天天看點

c++指向指針的指針 **p,指向指針數組的指針數組** p——指向指針的指針

** p——指向指針的指針

指針是一種特殊的資料類型,也是占記憶體的能尋址的,這跟電腦的作業系統的位數有關,我是64位的。

int 類型

以整型指針數組為例,先定義一組指向整型的指針數組*p,再定義一組指向整形指針的指針數組**p:

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
    int val[5]={1,2,3,5};
    int *p[5];
    int **pp[5];
    for(int i=0;i<5;i++)
    {
        p[i]=&val[i];//一階指針指向數組的各個元素
        pp[i]=&p[i];//二階指針指向各個一階指針
        cout<<p[i]<<setw(20)<<pp[i]<<setw(7)<<*p[i]<<setw(7)<<**pp[i]<<endl;
    }
    
    return 0;
}
           

運作結果為

0x7ffe6cfddfe0      0x7ffe6cfde000      1      1                                                                        
0x7ffe6cfddfe4      0x7ffe6cfde008      2      2                                                                        
0x7ffe6cfddfe8      0x7ffe6cfde010      3      3                                                                        
0x7ffe6cfddfec      0x7ffe6cfde018      5      5                                                                        
0x7ffe6cfddff0      0x7ffe6cfde020      0      0
           

可以看出,p[i]輸出的是數組元素的存儲位址,pp[i]輸出的是指針元素的存儲位址,發現一個整型資料需要4個位元組的存儲空間,而一個指針需要8個位元組的存儲空間;同時,可以知道*p[i]和**pp[i]最終指向一個位址,他們的值是一樣的。二階指針沿着一階指針找到val[]。

字元型指針的指針

字元數組的每一個元素都是一個字元,占一個位元組

pp[i]輸出的是一階指針的位址,而**pp[i]輸出的和*p[i]輸出的是一樣的,都是所指向元素的字元的值。

對于字元數組,和整形數組在一階指針上有所差別,如下:

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
    char val[5]={'1','2','3','5'};
    char *p[5];
    char **pp[5];
    cout<<val<<endl;
    cout<<&val<<endl;
    for(int i=0;i<5;i++)
    {
        p[i]=&val[i];//一階指針指向數組的各個元素
        pp[i]=&p[i];//二階指針指向各個一階指針
        cout<<setw(7)<<p[i];//輸出的p[i]與整型數組有所不同,不再是位址
        cout<<setw(20)<<pp[i];//輸出一階指針的存儲位址
        cout<<setw(7)<<*p[i];
        cout<<setw(7)<<**pp[i];
        cout<<setw(20)<<static_cast<void *>(p[i])<<endl;//輸出每一個元素的存儲位址
        
    }
    return 0;
}
           

運作結果如下

1235                                                                                                                    
0x7ffd7b4acac3                                                                                                          
   1235      0x7ffd7b4aca60      1      1      0x7ffd7b4acac3                                                           
    235      0x7ffd7b4aca68      2      2      0x7ffd7b4acac4                                                           
     35      0x7ffd7b4aca70      3      3      0x7ffd7b4acac5  
       5      0x7ffd7b4aca78      5      5      0x7ffd7b4acac6                                                           
                0x7ffd7b4aca80                     0x7ffd7b4acac7 
           

可以看出,cout<<val,直接輸出字元數組的内容;

cout<<&val,輸出的是字元串的首位址,也就是數組中第一個元素,第一個字元的存儲位址;

cout<<p[i],輸出的是所指位址的元素及其後面的元素,直到讀到\0的時候停止讀取;

cout<<pp[i],輸出的是一階指針的存儲位址,每個指針占八個位元組;

cout<<*p[i]和**pp[i],輸出的都是所指位址的那個元素;

cout<<static_cast<void *>(p[i]),可以輸出每一個元素的存儲位址。

指向字元串指針的指針

和指向字元的指針用法是一樣的,不同的是,一個字元串包含多個字元,占多個位元組,但是

cout<<*p[i]和**pp[i]輸出的都是所指位址的字元串中第一個字元的值。

cout<<p[i]會輸出每一個字元串的值

cout<<static_cast<void *>(p[i]),可以輸出每一個字元串的存儲首位址。

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    char *pc[5]={"happy","wife","happy","life","haha"};
    char **pcc[5];
    for(int i=0;i<5;i++)
    {
        pcc[i]=&pc[i];
        cout<<setw(7)<<pc[i];//輸出的是每一個字元串的值
        cout<<setw(20)<<pcc[i];//輸出一階指針的存儲位址
        cout<<setw(7)<<*pc[i];
        cout<<setw(7)<<**pcc[i];
        cout<<setw(20)<<static_cast<void *>(pc[i])<<endl;//輸出每一個元素的存儲位址
    }
    return 0;
}
           

運作結果如下

happy      0x7fff567d6170      h      h            0x400bf7                                                           
   wife      0x7fff567d6178      w      w            0x400bfd                                                           
  happy      0x7fff567d6180      h      h            0x400bf7                                                           
   life      0x7fff567d6188      l      l            0x400c02                                                           
   haha      0x7fff567d6190      h      h            0x400c07 
           

自己在學的過程中終于弄懂了指針在各種資料類型中的各種表示所代表的資料是什麼,以上内容如有錯誤,歡迎評論指正哦。

繼續閱讀