質問1:
まず、私は malloc していないので、これはまだすべてスタックに保持されていますよね?
ポインターはスタック上で宣言されていますが、まだ何も指していません。次のようなことをする必要があります:
char (*a)[10];
char array[10];
a = &array;
それ以外の場合a
は何も指さず、それにアクセスしようとすると問題が発生します。
ここで、配列の 2 番目の要素にアクセスしたい場合、*
(a+2*sizeof(char))を実行しますか?
sizeof(char)
使用しているポインターまたは配列の型を使用して、コンパイラーが追加のサイズを計算するため、と言う必要はありません。また、2 番目の要素が必要な場合は、2 ではなく 1 を追加する必要があります (配列/ポインターはゼロからインデックスを作成するため)。
質問2:
(次回は複数の質問を開くことをお勧めします:)
整数配列から 2 番目のバイトを取得したい場合は、次のようにします*((char*)((char*)a+2))
。
まず、あなたが言うとき、それを理解することが重要です:
int* a = malloc(10*sizeof(int));
配列ではない 10 個の整数に十分なスペースを持つメモリ ブロックへのポインタがあります。これがわかりにくい場合は、ポインタと配列に関する C-FAQ を参照してください。
ここで、a が指すメモリ ブロックの 2 番目のバイトが必要な場合は、次のように言えます。
char second_byte = *((char*)a+1);
キャストは加算よりも優先順位が高いため、加算が実行a
されると として扱われchar*
ます。ただし、コードを読む際の誤解の可能性を最小限に抑えるために、おそらく次のように記述します。
char second_byte = *(((char*)a)+1);
またはそれ以上:
char second_byte = ((char*)a)[1];
その代わり。元の例の余分なキャストは不要であることに注意してください。