C ++ノート(27)-ポインター変数、配列とポインター、ポインター配列、配列ポインター

1.ポインタ変数とは何ですか?

ポインタ変数は、ポインタを格納するための特別な変数です。

int main(int argc, char *argv[])
{
    
    
    int a = 10;
    int *p = &a;    //通过取地址符号 & 把 a 变量的地址传给指针变量 p
    std::cout << "p is " << p << std::endl;     // p is 0x7fffe740301c
    std::cout << "&a is " << &a << std::endl;   //&a is 0x7fffe740301c
    std::cout << "*p=" << *p << std::endl;      // *p=10
    return 0;
}

示されたアドレスに格納されて*pいるポインタ変数pを取得することによるシンボルp引き出しを開いて抽出した引き出し(住所)データのキーを取得する変数から理解できます

2.配列とポインタ

int main(int argc, char *argv[])
{
    
    
    int a[3] = {
    
    1,2,3};
    int *p = a;
    std::cout << "p is " << p << std::endl;    
    std::cout << "&a is " << &a << std::endl;   
    std::cout << "a is " << a << std::endl;    
    std::cout << "&a[0] is " << &a[0] << std::endl;     
    std::cout << "*p=" << *p << std::endl;      
    std::cout << "*(p+1)=" << *(p+1) << std::endl;     
    std::cout << "a[1]=" << a[1] << std::endl;  
    return 0;
}

実行出力結果:

p is 0x7fff7b96be40
&a is 0x7fff7b96be40
a is 0x7fff7b96be40
&a[0] is 0x7fff7b96be40
*p=1
*(p+1)=2
a[1]=2

a値は、a最初の要素の配列アドレスであり&a[0]&a同等のものです。

また、p + 1は、配列aの2番目の要素のアドレスを表します。

得られた配列の2番目の要素はa [1]または*(p + 1)です。

3.ポインター配列

ポインタ型のデータが配列に格納されていることを示します。

定義方法

int *p[]

例:

int main(int argc, char *argv[])
{
    
    
    int a[3] = {
    
    1,2,3};
    int *p[3] = {
    
    a,a+1,a+2};
    std::cout << "a= " << a << std::endl;     
    std::cout << "a+1= " << a+1 << std::endl;   
    std::cout << "a+2= " << a+2 << std::endl;  
   
    std::cout << "*p=" << *p << std::endl;      
    std::cout << "*(p+1)=" << *(p+1) << std::endl;   
    std::cout << "p[1]=" << p[1] << std::endl;    
    std::cout << "**p=" << **p<< std::endl;  
    std::cout << "**(p+1)=" << **(p+1) << std::endl;  
    return 0;
}

出力:

a= 0x7ffd747a1b70
a+1= 0x7ffd747a1b74
a+2= 0x7ffd747a1b78
*p=0x7ffd747a1b70
*(p+1)=0x7ffd747a1b74
p[1]=0x7ffd747a1b74
**p=1
**(p+1)=2

aa+1a+2それぞれ、最初の配列、第二、第三のエレメントアドレス。

p+1p2番目の要素のアドレスへのポインタの配列を参照し、*(p+1)(同等のp[1])は2番目のアドレスストレージ要素の値であるを参照しますa+1

a+1*(p+1)値が等しいです。

4.配列ポインタ

int型ポインタのような配列型であるポインタ、char同じ型のポインタ。
定義方法:

int (*p)[n]

()優先度が高く、最初に説明したのpは整数の1次元配列へのポインタであり、1次元配列の長さはnであり、pはステップサイズと言えます。

例:

int main(int argc, char *argv[])
{
    
    
    int a[3] = {
    
    1,2,3};
    int (*p)[3] = &a;   //定义一个指向长度为 3 的 int 数组的指针
    std::cout << "a  = " << a << std::endl;     
    std::cout << "a+1= " << a+1 << std::endl;   
    std::cout << "p+1= " << p+1 << std::endl; 
    std::cout << "a+2= " << a+2 << std::endl;  
   
    std::cout << "&a= " << &a << std::endl; 
    std::cout << " p= " << p << std::endl;  
    std::cout << "*p= " << *p << std::endl;  
    return 0;   
}

出力:

a  = 0x7ffd63226b30
a+1= 0x7ffd63226b34
p+1= 0x7ffd63226b3c
a+2= 0x7ffd63226b38
&a= 0x7ffd63226b30
 p= 0x7ffd63226b30
*p= 0x7ffd63226b30

&aそしてap値は等しく、インデックスはa最初の要素のアドレスに設定されます。

2つの値を詳しく見ると、p+1(0x7ffd63226b3c)はp(0x7ffd63226b30)+ 12、つまりaすべての要素を組み合わせた長さ(長さ3 * intタイプ4バイト)の配列、配列ポインターp+ 1であり、配列a要素の長さではなく、すべての要素を組み合わせた長さの配列。

pそして*p、2つの値は同じです。*p値はa最初の要素の配列アドレスであり、最初の要素pの配列aアドレスもありpますが、配列全体のアドレスを参照しますが、a代わりに最初の要素の配列がアドレスを*p参照し、これ参照しますアドレス値に対応する配列、
つまり配列自体、つまり配列aa値はa最初の要素のアドレスであるため、に*p等しくなりaます。

int a[3] = {
    
    1,2,3};
int (*p)[3] = &a;
cout<<**p<<endl;
cout<<*(*p+1)<<endl;
cout<<(*p)[1]<<endl;

出力:

1
2
2

* pは配列の最初の要素のアドレスを意味し、** pは配列の最初の要素のアドレスに格納された値が1であることを意味し、p + 1は配列の2番目の要素のアドレスを意味します(* p +1)は、配列の2番目の要素のアドレスを意味します。格納されている値も2です。(* p)[1]は*(* p + 1)の値と同じで、どちらも配列の2番目の要素であるa [1]の値を表します。

次のように変更した場合:

int main(int argc, char *argv[])
{
    
    
    int a[3] = {
    
    1,2,3};
    int (*p)[3] = a;   
    return 0;
}

コンパイルしてエラーを報告します:

cannot convert ‘int*’ to ‘int (*)[3]in initialization

ので、aこれは一次元アレイであり、aそれは配列を表しa、むしろアドレスの配列全体よりも初のエレメントアドレスを、。

配列が次のように定義された2次元配列であるとします。

int main(int argc, char *argv[])
{
    
    
    int a[2][3] = {
    
    {
    
    1,2,3},{
    
    4,5,6}};
    int (*p)[3] = &a; 
    return 0;
}

コンパイルしてエラーを報告します:

cannot convert ‘int (*)[2][3]’ to ‘int (*)[3]in initialization

これaは2次元配列であり&a、2 * 3 = 6要素の配列で構成されるアドレスの2次元配列全体表すためです。どうすれば変更できますか?

次のように変更できます。

int (*p)[3] = a; // 这里 a 理解为二维数组 a 第一维 a[0][]数组的地址。

または代わりに:

int (*p)[2][3] = &a; // 表示2行3列的二维数组地址

完全なコード:

int main(int argc, char *argv[])
{
    
    
    int a[2][3] = {
    
    {
    
    1,2,3},{
    
    4,5,6}};
    int (*p)[3] = a;   
    std::cout << "a= " << a << std::endl;     
    std::cout << "a+1= " << a+1 << std::endl;   
    std::cout << "a+2= " << a+2 << std::endl;  
   
    std::cout << "&a=" << &a << std::endl; 
    std::cout << "p=" << p << std::endl;      
    std::cout << "*(p+1)=" << *(p+1) << std::endl;   
    std::cout << "p[1]=" << p[1] << std::endl;    
    std::cout << "**p=" << **p<< std::endl;  
    std::cout << "**(p+1)=" << **(p+1) << std::endl;     
    return 0;
}

出力結果:

a= 0x7ffe52d671f0
a+1= 0x7ffe52d671fc
a+2= 0x7ffe52d67208
&a=0x7ffe52d671f0
p=0x7ffe52d671f0
*(p+1)=0x7ffe52d671fc
p[1]=0x7ffe52d671fc
**p=1
**(p+1)=4

おすすめ

転載: blog.csdn.net/wohu1104/article/details/112503395