int へのポインターと int の配列へのポインターの違い



int main()
{
int (*x)[5]; //pointer to an array of integers
int y[6] = {1,2,3,4,5,6}; //array of integers
int *z; //pointer to integer
z = y;
for(int i=0;i<6;i++)
printf("%d ",z[i]);
x = y;
for(int i=0;i<6;i++)
printf("%d ",(*x)[i]);
return 0;
}

上記の両方の printfs は、1 から 6 までの数字を出力します。

"整数の配列へのポインタ " および "整数へのポインタ " は同じことを行うことができます。それらは同じ内部表現を持っていますか?

編集:このコードは、以下の回答で指摘されているようにコンパイルすると警告が表示されますが、gcc を使用して x86_64 マシンで両方の時間に値を正しく出力します


答え:


まず、コードがコンパイルされません。配列の型は int[6] です (6 要素)、ポインターの型は int (*)[5] です .型が異なるため、このポインターがその配列を指すようにすることはできません。


次に、そのようなポインターを初期化 (代入) するときは、 & を使用する必要があります 配列:x = &y 、単なる x = y ではありません あなたのコードのように。


実際のコードをコピーして貼り付けるのではなく、単にコードを入力しただけだと思います.


第三に、内部表現について。一般に、実際には、すべてのデータ ポインターが同じ内部表現を使用することを期待する必要があります。さらに、上記の割り当ての後 (正しく記述されている場合)、ポインターは同じ数値になります。 int (*)[5] の違い と int * 概念レベル、つまり言語のレベルでのみ存在します。タイプは異なります。それにはいくつかの結果があります。たとえば、 z をインクリメントすると 配列の次のメンバーにジャンプしますが、 y をインクリメントすると 、配列全体などをジャンプします。したがって、これらのポインターは実際には「同じことをする」わけではありません。