配列ポインタとポインタ配列
3352 ワード
フレーズ
まず、配列ポインタとポインタ配列の2つの名詞を理解します.
「配列ポインタ」と「ポインタ配列」は、名詞の間に「の」の字をつけるだけで中心がわかります.
配列のポインタ:ポインタです.どんなポインタですか.配列へのポインタ.
ポインタの配列:配列ですが、どのような配列ですか.ポインタが入った配列.
次に、()>[]>*の優先順位を明確にする必要があります.
(*p)[n]:優先度に基づいて、カッコ内を先に見ると、pは1次元配列を指し、配列長はnであり、これは「配列のポインタ」、すなわち配列ポインタである.
*p[n]:優先度に基づいて、まず[]を見ると、pは配列であり、さらに*を結合し、この配列の要素はポインタタイプであり、n個の要素があり、これは「ポインタの配列」、すなわちポインタ配列である.
上記の2つの解析から,pが何であるか,フレーズの中心語が何であるか,すなわち配列「ポインタ」とポインタ「配列」であることがわかる.
配列ポインタ(*p)[n]
配列ポインタ:ポインタ--配列を指すポインタです.
次の例を見て理解します.
上の2次元配列から、配列ポインタは1次元配列を指すポインタとも呼ばれるので、配列ポインタは行ポインタとも呼ばれる.
ポインタ配列*p[n]
ポインタ配列:ポインタが入った配列です.
次の例を見て理解します.
最後に、上記から見ると、
配列ポインタはポインタ変数であり、メモリ内のポインタの記憶空間を占有する.
ポインタ配列は複数のポインタ変数であり、配列の形でメモリに格納され、複数のポインタの記憶空間を占有する.
2 D配列を指し、値をとります.
まず、配列ポインタとポインタ配列の2つの名詞を理解します.
「配列ポインタ」と「ポインタ配列」は、名詞の間に「の」の字をつけるだけで中心がわかります.
配列のポインタ:ポインタです.どんなポインタですか.配列へのポインタ.
ポインタの配列:配列ですが、どのような配列ですか.ポインタが入った配列.
次に、()>[]>*の優先順位を明確にする必要があります.
(*p)[n]:優先度に基づいて、カッコ内を先に見ると、pは1次元配列を指し、配列長はnであり、これは「配列のポインタ」、すなわち配列ポインタである.
*p[n]:優先度に基づいて、まず[]を見ると、pは配列であり、さらに*を結合し、この配列の要素はポインタタイプであり、n個の要素があり、これは「ポインタの配列」、すなわちポインタ配列である.
上記の2つの解析から,pが何であるか,フレーズの中心語が何であるか,すなわち配列「ポインタ」とポインタ「配列」であることがわかる.
配列ポインタ(*p)[n]
配列ポインタ:ポインタ--配列を指すポインタです.
次の例を見て理解します.
#include "stdafx.h"
int main()
{
//
int a[5] = { 1, 2, 3, 4, 5 };
// 5 , 5
int (*p)[5];
// a p, p a , *p a
p = &a;
//%p , %d
//
// C , , , , 。
printf("%p
", a); // , ,
printf("%p
", p); // ,p a , a
printf("%p
", *p); //*p a ,
printf("%p
", &a[0]); //a[0]
printf("%p
", &a[1]); //a[1]
printf("%p
", p[0]); //
printf("%d
", **p); //*p a , a , *(*p) , *p ,**p 1
printf("%d
", *p[0]); // ,p[0] , *p[0] , 1
printf("%d
", *p[1]); // , a[1]...
//
int b[3][4];
int(*pp)[4]; // , 4
pp = b; // pp, b[0] &b[0], pp=b pp=&b[0]
pp++; //pp=pp+1, pp b[0][] b[1][],pp=&b[1]
int k;
scanf_s("%d", &k);
return 0;
}
上の2次元配列から、配列ポインタは1次元配列を指すポインタとも呼ばれるので、配列ポインタは行ポインタとも呼ばれる.
ポインタ配列*p[n]
ポインタ配列:ポインタが入った配列です.
次の例を見て理解します.
#include "stdafx.h"
int main()
{
int a = 1;
int b = 2;
int *p[2];
p[0] = &a;
p[1] = &b;
printf("%p
", p[0]); //a
printf("%p
", &a); //a
printf("%p
", p[1]); //b
printf("%p
", &b); //b
printf("%d
", *p[0]); //p[0] a , *p[0] a
printf("%d
", *p[1]); //p[1] b , *p[1] b
//
int *pp[3]; // , p[0]、p[1]、p[2],
int c[3][4];
for (int i = 0; i<3; i++)
pp[i] = c[i];
int k;
scanf_s("%d", &k);
return 0;
}
最後に、上記から見ると、
配列ポインタはポインタ変数であり、メモリ内のポインタの記憶空間を占有する.
ポインタ配列は複数のポインタ変数であり、配列の形でメモリに格納され、複数のポインタの記憶空間を占有する.
2 D配列を指し、値をとります.
#include "stdafx.h"
int main()
{
/* , 、
2 3
0 1 2
3 4 5
1 2 :5*/
int a[2][3] = { {0, 1, 2}, {3, 4, 5} }; //2 3
int(*p)[3]; // , 3
int *q[2]; // , 2
p = a;
q[0] = a[0];
q[1] = a[1];
// 1 2
printf("%d
", a[1][2]); //5
printf("%d
", *(p[1] + 2)); //5
printf("%d
", *(*(p + 1) + 2)); //5
printf("%d
", (*(p + 1))[2]); //5
printf("%d
", p[1][2]); //5
printf("%d
", *(q[1] + 2)); //5
printf("%d
", *(*(q + 1) + 2)); //5
printf("%d
", (*(q + 1))[2]); //5
printf("%d
", q[1][2]); //5
int k;
scanf_s("%d", &k);
return 0;
}