配列ポインタとポインタ配列

3352 ワード

フレーズ
まず、配列ポインタとポインタ配列の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; }