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
a
、a+1
、a+2
それぞれ、最初の配列、第二、第三のエレメントアドレス。
p+1
p
2番目の要素のアドレスへのポインタの配列を参照し、*(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
そしてa
、p
値は等しく、インデックスは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
参照し、これを参照しますアドレス値に対応する配列、
つまり配列自体、つまり配列a
のa
値は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