コードスニペットは次のように与えられます。
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 ビット マシンでは、 が を指している場合、は を指します。p
char**
s
1000
p
1008
この式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を参照してください。