-1

このコードでは:

#include<stdio.h>
  int main()
  {
    int num[2] = {20, 30};
    printf("%d", num);
    printf("%d", &num[0]);
    return 0;
  }

私の知る限りnum、最初のステートメントでnumは int へのポインターであるため、両方の printf ステートメントが最初の要素のアドレスを出力します。

しかし、numがポインタの場合、任意のアドレスも持つ必要がありますが、そのアドレスを ( でprintf("%d", &num)) 出力すると、最初の要素のアドレスが表示されます。

2 次元配列では、全体も混乱します。

#include<stdio.h>
int main(void)
{
    int num[ ] [2]={20,30,40,50};
    printf("%d",*num);
    return 0;
}

このプログラムは、 のアドレスである 0 番目の要素のアドレスを出力していますnum[0][0]。しかし、なぜこれを行うのですか?それらはすべて同じアドレス (num,num[0]およびnum[0][0]) を持っているため、格納されている値を出力しないのはなぜですか?

4

5 に答える 5

1

2 番目の例でnumは、2 次元配列、つまり配列の配列です。それが最初の要素であることは事実です*numが、この最初の要素は配列そのものです。

を取得するにはnum[0][0]、 が必要**numです。

printf("%d\n", **num);
于 2014-10-27T13:46:42.337 に答える
1

配列がどのように見えるか見てください:

int num[ ] [2]={20,30,40,50};

次のように書くほうがよい

int num[][2]={{20,30},{40,50}};

2要素の配列です。これらの 2 つの要素は、2 つの int を持つ配列です。

メモリでは、それらは次のように見えます

20    30    40    50

ただし、違いは、num配列全体num[0]、最初の「部分配列」、およびnum[0][0]最初の配列の最初の要素を参照することです。

アドレスは同じですが (同じ場所から開始するため)、タイプが異なります。

つまり、ポインターで重要なのはアドレスだけではなく、型も重要です。

于 2014-10-27T14:19:50.763 に答える