2016-04-24 10 views
-3

2行目に(* d)[4]に割り当てられているものはありますか?d [2] [3]の値を説明してください

出典:

#include<stdio.h> 

int main() 
{ 
    int c[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}, 
     (*d)[4] = (int (*)[4])(c+5); 

    printf ("d[2][3]: %d\n", d[2][3]); 

    return 0; 
} 

出力:

D [2] [3]:16

+0

で宣言されていないです。 –

+0

MCVEをコンパイルするテストコード全体を投稿してください。 –

+0

@MartinJamesコードは私のためにコンパイルされます..主な機能の中でコードを歪ませるだけです – jboockmann

答えて

-1
int (*d)[4] 

が整数にポインタのアレイである

と仮定整数は、あなたのシステム内の4つのバイトを占有し、メモリの割り当ては、すなわち&c[0]zero

(*d)[4] = (int (*)[4])(c+5) 

で、ゼロから始まる(* D)[0]の値に

c+5*sizeof(int) 
を持つようになります

0+5*4 = 20. 

キャスト:(int*)20はメモリアドレスとして考え、の値は、あなたのケースで詳述すると5

である整数です。

d[0] will have the value 20 

&

(*d)[0] will have the value 5 ie dereferencing the contents of address 20 

メモリが連続して割り当てられていましたブロックしたときにあなたはint [20]

つまり

add - value 
0 - 0 
4 - 1 
8 - 2 
. 
. 
. 
24 - 6 
. 
. 
and so on 

私はこのメモリを4 * 4ブロックにグループ化しようとしていたと思います。 最初の4(0〜3の数)は行を表します(まではを4にします)、2番目の4(0〜3の数)は明示的に値を与えた列を表します。

操作のようなポインタ支持アレイ、

は(* D)実際実際dは*(D + 0)であるので、[0]。 [3] [3]あなたはあなたのケースの値(すなわち19)d[3][2]まで割り当てられて

d[0][0],d[0][1],d[0][3],d[0][3] 
. 
. 
. 

d[3][0],d[3][1],d[3][2] 

件まで持つことができ、Dに割り当てられたの値はありません。アクセスしようとすると、あいまいな値やプログラムのクラッシュが発生する可能性があります。

+0

@downvoter: – sjsam

-1

ポインタ演算は、 'd' をコンパイルしませんので、素敵な:-)

#include <stdio.h> 

int main(void) 
{ 
    // create a 1D array with size 20 containing the elements 0 to 19 
    int c[20] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}; 

    // (c+5): c is a pointer to the first element of your array, hence c+5 points to the 5th element 
    printf("c+5: %d\n", *(c+5)); // => 5 

    // by casting (c+5) to (int (*)[4]), d is a pointer to a 2D-array with 4 columns and 4 rows 
    // 2d-arrays are major row, hence the 4 from (int (*)[4]) indicates the number of columns 
    int (*d)[4] = (int (*)[4])(c+5); 

    // the array represented by d looks as follows 
    // 5 6 7 8 
    // 9 10 11 12 
    // 13 14 15 16 
    // 17 18 19 ? 
    // As we do not have enough elements to fill the last row, we may not access the ? element 

    // if we now select position [2][3], we select the value of the cell at row 2 and column 3 
    printf ("d[2][3]: %d\n", d[2][3]); // => 16 

    return (0); 
} 
+0

dの宣言、その代入、2次元配列へのポインタの詳細について教えてください。 – djvu

+1

(downvoterではありません) Answer(//と/ *)を使ってコード自体に記述したことは分かっていますが、それは少し不明瞭で読みにくいです。その情報をcコメント。 –

+1

私はdownvoteが 'dが2次元配列へのポインタであると考えています。ここには2次元配列はありません。虚数の第2次元があっても、すべての値が満たされているわけではありません。 3] [3] '割り当てられておらず、アクセスするとプログラムがクラッシュする可能性があります。 'd [2] [3]'までの値が代入され、値19が得られます – sjsam

関連する問題