コードスニペットは次のように与えられます。
char *s[] = {"program", "test", "load", "frame", "stack", NULL};
char **p = s + 2;
次のステートメントの出力を見つける必要があります。
printf("%s", p[-2] + 3);
何p[-2]を指しますか?
コードスニペットは次のように与えられます。
char *s[] = {"program", "test", "load", "frame", "stack", NULL};
char **p = s + 2;
次のステートメントの出力を見つける必要があります。
printf("%s", p[-2] + 3);
何p[-2]を指しますか?
char *s[] = {"program","test","load","frame","stack",NULL};
char **p = s + 2
printf("%s", p[-2] + 3);
sはchar*ポインターの配列です。pはポインターへのポインターです。ポインター演算は、配列sを aにダウングレードし、 a のサイズの 2 倍の値にchar**初期化します。32 ビット マシンでは、 が を指している場合、は を指します。pchar**s1000p1008この式p[-2]は と同等で*(p - 2)、 への単純なポインタを返しますchar*。この場合、文字列配列の最初の要素を指す値: "program".
最後に、*(p - 2)is は文字列 の最初の文字を指す式であるため、その単語の 4 番目の文字を指します"program": .*(p - 2) + 3"gram"
printf("%s", *(p - 2) + 3); /* prints: gram */
コードをコンパイルしてみましたか? 構文エラーが修正されると、出力はgramになります。
#include <stdio.h>
int main()
{
char *s[] = {"program","test","load","frame","stack",NULL};
char **p = s + 2;
printf("%s",p[-2] + 3);
return 0;
};
コンパイルと出力については、http://ideone.com/eVAUvを参照してください。