#include<stdio.h>
int main()
{
char str[25] = "helloworld";
printf("%s %s", &str+2,str+2);
return 0;
}
ここでの&str+2とstr+2の違いはstr=&strです。私を助けてください。
ありがとう
#include<stdio.h>
int main()
{
char str[25] = "helloworld";
printf("%s %s", &str+2,str+2);
return 0;
}
ここでの&str+2とstr+2の違いはstr=&strです。私を助けてください。
ありがとう
配列がある場合:配列str[xxx]
str
の先頭のメモリアドレスを指定するとstr+2
、"lloworld"
.
str が格納されているアドレス&str
を示します。したがって、 &str+2 を印刷すると、予期しない動作が発生します。
&
変数が指す値ではなく、その変数のアドレスを取得します。ただし、charの配列を使用すると、値はその配列の先頭(最初のスロット)になります。
&str+2
のメモリ位置を取得し、str
を追加します2
。
str+2
開始のメモリ位置を取得し、2バイトを追加します(char
= 1バイト、ポインタ演算を調べます)。
&str + 2は実際にアドレスを提供しますが、ここではprintfステートメントで%sを使用しているため、出力にガベージ値が提供され、str+2の場合は出力はllworldになります。
このリンクで出力コンパイルを数回チェックし、取得する出力を確認してください
他に何もなければ&str
(したがって) は、指定子&str+2
に渡す型が間違っています。(へのポインター)が必要で、型(25の配列へのポインター) があります。に間違った型を渡すと、未定義の動作が呼び出されます。printf
%s
char *
char
&str
char (*)[25]
char
printf
さらに、&str
長さ 1 の配列を指す (その要素はchar
長さ 25 の配列であり、そのうちの 1 つしかない) ため、&str+2
範囲外のポインター演算と未定義の動作になります。
&str
vailabel のアドレスを「9」または 16 進数の「0x009」のように出力します
str+2
lloworld
ここで +2 は増分値として表示されます
str + 2 は文字列の 3 番目のシンボルへのポインタ、&str + 2 は文字列プラス 2 へのポインタへのポインタです。
str は、文字 (配列の最初の文字) へのポインターです。&str は文字配列へのポインターです。
演算 str+2 を実行すると、2 バイトがインクリメントされます。(本質的にcharポインターとして)。操作 &str+2 を実行すると、22 バイトがインクリメントされます。(文字配列の長さは 11 バイトであるため)。
これが唯一の違いです。
よろしく、 ナガラジ
参考までに以下のコードを試してみてください!
#include<stdio.h>
int main()
{
char str1[11] = "1111111111";
char str2[11] = "2222222222";
char str[11] = "helloworld";
char str3[11] = "3333333333";
char str4[11] = "4444444444";
printf("%s %s\n", &str-2,str+2);
return 0;
}