0

(int *)2次元配列の場合に型キャストを使用する必要があるのはなぜですか? もう 1 つ知りたいのは*(*(p+i)+j))、次のコードで を使用して 2 次元配列にアクセスできないのはなぜですか? 常に使用する必要がありますp + col*i + jか? が配列のベースアドレスを含み、と同等である*(*(p+i)+j))場合に使用できないのはなぜですか?p*(*(p+i)+j))a[i][j]

前もって感謝します。

main()
{
    int a[3][4] = {
        1,2,3,4,
        5,6,7,8,
        9,0,1,6
    };

    int *p,i,j;
    p=(int *)a;       // this is my doubt why did we use int *
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++) {
            printf("%d",*(*(p+i)+j));   // here is my 2nd doubt
        }
    }
}
4

2 に答える 2

1

あなたが提供したコードは、次の行のためにコンパイルされません:

printf("%d",*(*(p+i)+j));

int* を 2 回逆参照している場所

4 つの要素の配列へのポインター型の配列 a を参照するポインターを作成できます。ネストされた for ループの実行中にすべてのポインターが出力される添付のコードを参照してください。

#include<stdio.h>

main()
{
    int a[3][4]={
        1,2,3,4,
        5,6,7,8,
        9,0,1,6
    };

    int (*p)[4],i,j;
    p = a;
    for(i=0;i<3;i++){
        printf("row pointer: %p\n",p+i);
        for(j=0;j<4;j++){
            printf("element pointer: %p\n", (*(p+i))+j );
            printf("element: %d\n",*( (*(p+i)) + j ) );
        }
    }
}
于 2013-09-15T18:40:53.040 に答える
1

あなたのコードはコンパイルさえしません.2番目の疑いがある場所です. 私はそれを修正しました:

#include <stdio.h>                                                  
int main(int argc, char *argv[])                                    
{                                                                   
    int a[3][4] = {                                                 
        1,2,3,4,
        5,6,7,8,                                                  
        9,0,1,6,
    };                                                              

    int *p, i, j;                                                   
    p = a[0];       // No cast, just address the 1st row
    for (i = 0; i < 3; i++) {                                       
        for (j = 0; j < 4; j++) {                                   
            printf("%d", *(p + 4*i + j));   // corrected pointer arithmetic
        }                                                           
    }                                                               
}                                                                   

ポインタpは、それが 2-dim 配列をアドレス指定していることを知りません。これは単なる int ポインタです。空白で区切らずに数値を出力してもよろしいですか?

于 2013-09-15T18:39:52.167 に答える