#include <stdio.h>
#include <string.h>
int main()
{
char *p;
char str[10],name_first[10];
int i,count;
printf("\nName before reversing the string:::::::::::::");
scanf("%s",&name_first);
// I have taken a name in name_variable and now i want to reverse it
// using pointer for ex
count = strlen(name_first);
p=str+strlen(name_first)-1;
for(i=0;i<count;i++)
{
*(p-i)=*(name_first+i);
}
// now I am getting a reverse of string as a o/p but I want to know
// how p is pointing to the str as I'm not assigning any address,
// is it done automatically by the compiler?
printf("\nname after reversing the string::::::::::::::%s\n",str);
}
4 に答える
p
実際には、次のコード行でアドレスを割り当てています。
p=str+strlen(name_first)-1;
str
は配列であるため、配列名はベース アドレスを保持します。name_first
配列の長さを加算1
して減算すると、ポインタ演算が行われるため、結果が得られます。
変数を作成しましたcount = strlen(name_first)
。
strlen
そのため、アドレスを に割り当てるために再度呼び出す必要はありませんp
。
より高速な方法については、使用するだけです
p=str+count-1;
ステートメント:
p=str+strlen(name_first)-1;
str が指すメモリ内のアドレスを p に割り当てます。
したがって、str がアドレス 0x1000 から始まり、長さが 10 で、name_first の長さが 5 であるとします。その場合、p は 0x1004 を指します。
実行をループすると、0x1004、0x1003、0x1002、0x1001、および 0x1000 の文字が更新されるため、str の内容が更新されます。
これで疑問が解消されることを願っています。
str は、str[10] の最初の要素のポインターです。このステートメントでは: "p=str+strlen(name_first)-1;" rhs はアドレスです
char へのポインターである p には、p= 行の char 配列 str の最後の char のアドレスが割り当てられます。
次に、そのポインタを使用してそのメモリ ブロック内の char を操作し、操作メモリの内容を出力します (str は実際には char 配列への単なるポインタであるため)。