3

重複の可能性:
配列名は C のポインターですか?

次のコードを実行していました

#include <stdio.h>

int main()
{
  int a[4] = {1,2,3,4};
  int (*b)[4] = &a;
  int k = sizeof(a);
  printf("\n\n%d\n\n", k);
  printf("a = %u, b = %u, *b = %u, data = %d", a, b, *b, **b);
  return 0;
}

次の出力を得ました

a = 3485401628, b = 3485401628, *b = 3485401628, data = 1

ここでは、b の型が int** であるため、a のアドレスを b に割り当てていますが、出力では、a が指すアドレスが b が指すアドレスと同じであることがわかります。

私には少し混乱しているようです。説明は何ですか?

4

2 に答える 2

5

array の値は、配列aの最初の要素へのポインタaです。

pointer の値 ( pointer&aと同じ値と型b) は、 array へのポインターaです。

どちらも同じメモリアドレスから始まるため、値は同じです (ただし、型は異なります)。配列の先頭にパディングはできません。

評価されたときaの型int *&aあり、型int (*)[4]です。

ポインターのアドレスを出力する正しい方法は、変換指定子を使用することpです。例えば、

/* And p requires the argument to be a void *, so use a cast if
 * it is not the case
 */
printf("%p %p\n", (void *) a, (void *) &a);
于 2012-10-24T18:41:50.490 に答える
0

式 (printf の引数など) では、配列は (それぞれの配列への) ポインターに減衰します。つまり、式で "b" が "a" を指している場合、"a" も "a" へのポインターになります。 (「a」に割り当てられたメモリのブロック)。

ただし、実行時に (内部的に) 要素にアクセスする方法は異なります。この場合、「b」には追加の間接指定が必要です。

于 2012-10-24T18:42:27.590 に答える