Go言語でのポインター配列と配列ポインターの違いについて

ポインタの使用法についてはすでに詳しく説明しましたが、いわゆるポインタ配列と配列ポインタの違いは何ですか?それらの間の接続は何ですか?それが1つの意味であろうと別の意味であろうと、それについて以下で説明しましょう。

ポインター配列

まず、それは配列です。配列の要素はポインタです。配列が占めるバイト数は、配列自体のサイズによって決まります。各要素はポインタです。32ビットシステムでは、どのタイプのポインタも常に4バイトを占めます。 。「ポインタの配列」の略です。

配列ポインター

まず、配列を指すポインタです。32ビットシステムでは、どのタイプのポインターも常に4バイトを占有します。配列が指すバイト数については、配列のサイズによって異なります。「配列へのポインタ」の略です。

ポインタが後ろにある場合は、配列を指すだけのポインタであることを意味します。
ポインタが前にある場合は配列ですが、配列の要素はすべてポインタです。
だから誰もが私が話していることを理解できるはずです。

定義

配列ポインター(行ポインターとも呼ばれる)の定義

int (*p)[n]

()優先度が高いまず、pは整数の1次元配列を指すポインタであり、この1次元配列の長さはnであり、pのステップサイズとも言えます。つまり、p + 1が実行されると、pはn個の整数データの長さにまたがる必要があります。

//定义二维数组
 int a[3][4];

//该语句是定义一个数组指针,指向含4个元素的一维数组。
 int (*p)[4]; 
      
//将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p=a;  
    
//该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
 p++;   

したがって、配列ポインターは、1次元配列へのポインター、または行ポインターとも呼ばれます。

2次元配列
では、a、&a、a [0]、&a [0]、&a [0] [0]の5つの値は同じであり、すべて2次元配列の最初のアドレス(開始位置)を指します。
違いはこれらの5つにあります式のタイプは異なります。たとえば、int a [2] [3]とします。

aは2次元配列の名前であり、定数であり、2次元配列の最初のアドレスを格納します。型は2次元配列、sizeof(a)= 24です。

&a 2次元配列a(それ自体がポインター)の(最初の)アドレス、sizeof(&a)= 4、ポインター型は4

a [0]は2次元配列a [0] []の最初の行を指し、タイプは1次元配列ですsizeof(a [0])= 12
&a [0]はa [0]のアドレスを表し、1次元配列名a [0]は同じ値ですが、ポインタ型ですsizeof(&a [0])= 4
&a [0] [0]は2次元配列の最初の要素のアドレスを表し、ポインタ型はsizeof(&a [0]です[0])= 4

ポインター配列の定義

 int *p[n]

[]優先度が高く、最初にpと組み合わせて配列を形成します。次に、int *は、これがnポインター型配列要素を持つ整数ポインター配列であることを示します。ここでp + 1が実行されると、pは次の配列要素を指します。

次の割り当ては間違っています:

p = a;

pは認識できない表現であるため、p [0]、p [1]、p [2] ... p [n-1]のみが存在し、変数アドレスを格納するために使用できるポインター変数です。
ただし、次のように割り当てることができます。

* p = a;

ここで* pは、ポインタ配列の最初の要素の値を表します。これは、aの最初のアドレスの値です。

2次元配列をポインター配列に割り当てるには:

int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]

ここでint * p [3]は、1次元配列に格納されている3つのポインター変数(p [0]、p [1]、p [2])があることを意味するため、値を個別に割り当てます。

配列ポインタは単なるポインタ変数であり、特にC言語の2次元配列を指すために使用されているようで、メモリ内のポインタの記憶領域を占めています。

ポインタ配列は、配列の形でメモリに格納され、複数のポインタの格納領域を占める、いくつかのポインタ変数です。
説明が必要なもう1つの点は、2次元配列を同時に指す場合、参照は配列名による参照と同じであることです。
たとえば、配列の行iと列jの要素を表すには、次のようにします。

*(p[i]+j)*(*(p+i)+j)(*(p+i))[j]、p[i][j]

優先度:()> []> *

優先順位に従ってポインタ配列と配列ポインタを判断する

次のうちどれが配列ポインタであり、どれがポインタの配列ですか?

A)
int *p1[10];

B)
int (*p2)[10];

その前に、シンボルの優先順位を理解する必要があります。

最初に、A)の "[]"の優先度を "*"よりも分析します。
最初にp1を「[]」と組み合わせて配列の定義を形成します。配列名はp1です。int*は、配列の内容、つまり配列の各要素を変更します。これで、これが配列であり、int型データへの10個のポインター、つまりポインターの配列であることがわかります。

再分析B)「()」は「[]」よりも優先度が高い。
「*」記号とp2はポインターの定義を構成します。ポインター変数の名前はp2です。Intは配列の内容、つまり配列の各要素を変更します。ここでは配列に名前はありません。匿名配列です。
これで、p2が10のintデータを含む配列を指すポインター、つまり配列ポインターであることがわかりました。

以下に示すように:
ここに画像の説明を挿入

aと&aの違いについて

aと&aの違いを説明するために、コードは次のとおりです。

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[5] = &a;
   char (*p4)[5] = a;
   return 0;
}

p3 + 1の値は何ですか?p4 + 1の値は何ですか?p3とp4が配列全体を指す配列ポインターであることは間違いありません。
&aは配列全体の最初のアドレス、
aは配列の最初の要素の最初のアドレスです

値は同じですが、意味がまったく異なります。
C言語では、代入記号 "="の両側のデータ型は同じである必要があります。異なる場合は、明示的または暗黙的な型変換が必要です。

p3の定義の "="の両側のデータ型はまったく同じですが、p4の定義の "="の両側のデータ型は矛盾しています。
左側の型は配列全体へのポインターであり、右側のデータ型は単一の文字へのポインターです。

これで、p3とp4の両方が配列全体を指していることが明らかであるため、p3 + 1とp4 + 1の値は簡単に理解できます。

配列の長さをより小さなサイズに変更した場合の問題は何ですか?p3 + 1とp4 + 1の値は何ですか?

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[3] = &a;
   char (*p4)[3] = a;
   return 0;
}

配列の長さが増加した場合の問題は何ですか?

int main()
{
    
    
   char a[5]={
    
    'A','B','C','D'};
   char (*p3)[10] = &a;
   char (*p4)[10] = a;
   return 0;
}

現時点でのp3 + 1とp4 + 1の値は何ですか?

得られた結果:
(1)。以下char (*p2)[5]=a;
のような強制変換を使用する必要があります。

char (*p2)[5]=(char (*)[5])a;

(2)。配列の長さが変更された場合、コンパイルが失敗したというエラーメッセージ:

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[3]'

error C2440: 'initializing' : cannot convert from 'char (*)[5]' to 'char (*)[10]'

(3)。上記のプログラムを変更した後、正常に実行されるコードは次のとおりです。

int main()

{
    
    

  	char a[5]={
    
    'a','b','c','d'};

  	char (*p1)[5]= &a;

  	char (*p2)[5]=(char (*)[5])a;


  	printf("a=%d\n",a);

  	printf("a=%c\n",a[0]);

  	printf("p1=%c\n",**p1);

  	printf("p2=%c\n",**p2);

  	printf("p1+1=%c\n",**(p1+1));

  	printf("p2+1=%c\n",**(p2+1));


  	return 0;

}

演算結果:

a=1638208

a=a

p1=a

p2=a

p1+1=?

p2+1=?

Press any key to continue

後で結果を試して、何が得られるかを確認できます。

結論として:

ポインターの種類と指し示すオブジェクトによって、ポインターのサイズを示し、1増えるたびに、ポインターのサイズがバイト単位で増加することを意味します。

おすすめ

転載: blog.csdn.net/zp17834994071/article/details/108716755