友人がこのコードを手伝ってくれましたが、どのように機能するのかわかりません。5行目は(* pp-97)* 4で、基本的にはchar 110のサイズなので(110-97)* 4またはスキャンしたppの値?ありがとう
char *pp =(char*)malloc(110);
printf("Enter text: ");
scanf("%s", pp);
*pp = *(pp + n);
int f = (*pp - 97)*4;
*pp
と同等pp[0]
であり、通常*(pp + n)
はと同等でpp[n]
あることに注意してください。
*pp = *(pp + n);
atオフセットを最初のオフセット0にpp[0] = pp[n];
コピーすると書くこともできます。char
n
char
int f = (*pp - 97)*4;
そしてこれは書くことができます
int f = (pp[0] - 97)*4;
したがって、97(のASCII値)がブロックポイント'a'
の最初から減算され、その差に4が乗算されます。char
pp
これはかなり奇妙なスニペットです。
この行は基本的にサイズ110の文字列を宣言します。
char *pp =(char*)malloc(110);
これらの2行は、ユーザーからの入力を取得します。
printf("Enter text: ");
scanf("%s", pp);
今、これは物事が奇妙になり始めるところです。
*pp = *(pp + n);
上記の行は、この文字列の最初の文字を文字列のn番目の文字に変更します。
int f = (*pp - 97)*4;
今この行の観点から。ここでは、ポインタppを逆参照しています。このポインタを逆参照すると、ppが指しているのは最初の文字になります。この文字の値は整数(ASCII表現)に変換され、97(のASCII値a
)を減算してから4を掛けます。
char *pp = malloc(110);
printf("Enter text: ");
scanf("%s", pp);
pp[0] = pp[n];
int f = (pp[0] - 'a')*4;
Cでは、配列演算子はポインターの逆参照と同じです。正しい表記を使用することで、コードの混乱が少なくなります(imo)。
*(p + i)
は同義語であるp[i]
ため、*pp
と同じ*(pp + 0)
です。pp[0]