3

私はポインターについてほとんど知りません。

以下のプログラムに出会いました。出力は正常に見えますが、実際に何が起こっているのかわかりませんでした。

#include<stdio.h>
#include<conio.h>
void main()
{
     int k;
     int a[] = {1,2,3}; int *b[3] ; int **c[3];
     int ***d[3]; int ****e[3]; int*****f[3];
     for (k = 0 ; k <3; k++)
     {
         b[k] = a + k; c[k] = b + k ; d[k] = c + k;
         e[k] = d + k ; f[k] = e + k;

     }
     for (k = 0 ; k <3; k++)
     {
        printf("%3d", *b[k]); printf("%3d", **c[k]);
        printf("%3d", ***d[k]); printf("%3d", ****e[k]);
        printf("%3d\n", *****f[k]);
     }
}
4

4 に答える 4

1
     int k;
     int a[] = {1,2,3}; //array of 3 ints
     int *b[3] ; //array of 3 integer pointers
     int **c[3]; //array of 3 integer double pointers
     int ***d[3]; //array of 3 pointers to integer double pointers
     int ****e[3]; //array of 3 pointers to pointers to integer double pointers
     int*****f[3]; //array of 3 pointers to  pointers to pointers to integer double    pointers
     for (k = 0 ; k <3; k++)
     {
         b[k] = a + k; 
          //a gives base address to array a 
          //Add k to it and store it in b[k]. Note, this isn't normal arithmetic its 
          //pointer aritmetic 
         c[k] = b + k ; 
         d[k] = c + k;
         e[k] = d + k ; 
         f[k] = e + k;
     }
     for (k = 0 ; k <3; k++)
     {
        printf("%3d", *b[k]); //dereference single level pointer
        printf("%3d", **c[k]); //dereference second level pointer 
        printf("%3d", ***d[k]); printf("%3d", ****e[k]);
        printf("%3d\n", *****f[k]);
     }

ポインターのレベルはいくつでも持つことができます。つまり、(pointer to (pointer ...)) へのポインターなど [標準で定義された制限まで]

興味深い読み物については、これも参照してください。

于 2013-04-10T12:24:33.463 に答える
0

何が起こっているかは次のとおりです。

k データ型の変数を定義しますint

a値を持つ配列を定義します。1, 2, 3

ポインターの配列を定義しました。b

ポインターへのポインターの配列を定義しました。c

...................................および同様のf

0 から 2 まで繰り返し、値をbcd、 ...に割り当てました。f

再び 0 から 2 まで反復して、次のように出力しました。

b, c,.....の各要素が指す値f

EDIT : 何が起こったのか b[k] = a + k, メモリ内で k ブロック先に進み、そのアドレスは b[k] に割り当てられたので、b[k] はメモリ内のそのブロックを指します(任意の値)

于 2013-04-10T12:22:57.137 に答える
0

まず、何が行われているかを理解しようとしb[k] = a + kます。残りは同じです。

a[]は 3 つの要素1, 2, and 3を持つ配列であり、aそれ自体が配列の0th要素を参照します。つまり、配列aの最初の要素のアドレスです。

現在a + k、ポインター演算では、kthという名前の配列の要素を表しaます。

したがって、ループの最初のパスと k = 0 を考えてみましょう。

最初のステートメントは になりb[0] = a + 0ます。Noticea + 0はアドレスであり、 の要素に含まれていますb。したがって、bタイプは である必要があり、int *コードでは として宣言されていint *b[3]ます。

また、 forc[0] = b + 0は を格納しているaddress of address of intためc、 double pointer として宣言されていますint **c[3]

これらのことは、使用するすべての配列で発生しますが、追加のレベルのポインターを使用するだけです。つまり、前の配列の要素のアドレスを保持しています。

于 2013-04-10T12:26:59.467 に答える