C言語の2次元配列におけるポインタの問題

例として2次元配列a [3] [2]を取り上げ、2次元配列内のポインターの問題を簡単に紹介します。

1.基本的な意味

1. a [3] [2]は、3行2列の2次元配列を表し、a [0]、a [1]、a [2]は、の0番目の行、最初の行、および最初の要素を表します。それぞれの2行目地址
2.配列名aは、基本的に1次元配列(数组指针へのポインターであり、この場合は配列の0番目の行です。
注:配列名aの意味も&a [0]と同等です。

2.&a [0]とa [0]の違い:

両方で表されるアドレス値は同じですが、タイプと意味が異なります。

&a [0]とa [0]はどちらも、配列の0行目と0列目の要素の最初のアドレスを指しますが、&a [0]は基本的に1で数组指针あり、a [0]は基本的に1指向int类型的指针です。

これから推測できます:&a [0] +1とa [0] +1も異なる意味を持っています:

&a [0] +1は、配列の最初の行と0番目の列の要素アドレスを指し、a [0] +1は、配列の0番目の行と最初の列の要素アドレスを指します。

3.2次元配列での値演算子*の適用

*(a[1]+1)アドレス要素の値表すa [1] +1など、基本データを指すポインタ変数の場合。

この場合、&a[1]+1或a+2value演算子の結果は、int *型の行の0番目の要素のアドレスを表します。

要約すると、これは文です。基本データ型へのポインターが取得されると、戻り結果は対応する値になり、他のタイプのポインターが取得されると、戻り結果は対応するポインター変数にダウングレードされます。

4.関連するテストコード

#include <stdio.h> 

int main()
{
    
    
	int a[3][2] = {
    
    1,2,3,4,5,6};
	printf("a = %p\n&a[0] = %p\na[0] = %p\n",a,&a[0],a[0]);
	printf("-------------------\n");
	printf("&a[0] + 1 = %p\na[0] + 1 = %p\n",&a[0] + 1,a[0] + 1);
	printf("-----取值运算符-----\n");
	printf("*(a[1] + 1) = %d\n&a[1] + 1 = %p\na + 2 = %p\n",*(a[1] + 1),&a[1] + 1,a + 2);
	return 0;
}

おすすめ

転載: blog.csdn.net/m0_46550452/article/details/108954271