1

質問1:

K&Rの本を読んでいて、少し戸惑いました。単純なポインタ演算について少し混乱しています。私が言うなら

char (*a)[10];

10文字の配列へのポインタを宣言したばかりです。まず、mallocを実行しなかったため、これはまだすべてスタックに保持されていますか?それで、サイズ10のchar配列の開始を指しているスタックにこのポインターがありますか?

さて、配列の2番目の要素にアクセスしたい場合でも、*(a + 2 * sizeof(char))を実行しますか?それとも、この場合は機能しませんか?

質問2:

もしわたしが持っていたら

int* a = malloc(10*sizeof(int));

整数配列から2番目のバイトを取得したい場合は、次のようにします。

*((char*)((char*)a+2))

これは正しいです?

ありがとうございました。

4

3 に答える 3

2

ファースト シング ファースト

In C/C++, array index starts from 0 instead of 1. したがって、2 番目の要素にアクセスする場合は、 2 ではなくインデックス 1 を使用します。

答え 1

char (*a)[10];

はい、これはサイズ 10 の配列へのポインターです。ポインター自体はスタック上にあります。しかし、この 1 行については、有効な配列を指していません。つまり、それは初期化されています。

ポインタを初期化するには、

char b[2][10] = {"123456789", "abcdefghi"};
// initialize pointer "a"
char (*a)[10] = b;

「2 番目」の要素 (この場合は「2」) にアクセスするには、次のようにします。

char (*a)[10] = b;
// access the element at 1st row, 2nd column
printf("%c\n", a[0][1]);

答え 2

2バイト目にアクセスしたい。ただし、要素のインデックスは 1 ではなく 0 から始まるため、2 バイト目は「+2」ではなく「+1」を使用する必要があります。

*((char*)a+1);
于 2012-04-16T01:02:40.650 に答える
1

ポインターを宣言すると、まだ何も指していません。サイズ 10 の文字配列を宣言し、 (*a)[10]スタックに配置する場合はそのアドレスを割り当てる必要があります。2 番目の要素へのアクセスに関しては、ほとんどのコンパイラは次の要素に対して実行できます*(a+1)(したがって、4 バイトの int の場合、*(a+1) は 2 番目の要素であり、*(a+4) は 4 番目の要素です (NOT 4 番目のバイト)。

char (*a)[10];
char arrayTest[10];
a=&arrayTest;

2 番目の質問では、2 番目のバイトを取得して*aから、単に右シフトを実行します。

char Test= ((*a)&0x7FFF)>>8;
于 2012-04-16T01:02:08.920 に答える
1

質問1:

まず、私は malloc していないので、これはまだすべてスタックに保持されていますよね?

ポインターはスタック上で宣言されていますが、まだ何も指していません。次のようなことをする必要があります:

char (*a)[10];
char array[10];
a = &array;

それ以外の場合aは何も指さず、それにアクセスしようとすると問題が発生します。

ここで、配列の 2 番目の要素にアクセスしたい場合、*(a+2*sizeof(char))を実行しますか?

sizeof(char)使用しているポインターまたは配列の型を使用して、コンパイラーが追加のサイズを計算するため、と言う必要はありません。また、2 番目の要素が必要な場合は、2 ではなく 1 を追加する必要があります (配列/ポインターはゼロからインデックスを作成するため)。

  • (*a)+1指している配列の 2 番目の要素が必要な場合は、 orを実行できます(*a)[1]

  • ポインターが複数の配列を指していて、2 番目の配列が必要な場合は、 *(a+1)ora[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];

その代わり。元の例の余分なキャストは不要であることに注意してください。

于 2012-04-16T01:11:01.817 に答える