-2
#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

4 に答える 4

1

p実際には、次のコード行でアドレスを割り当てています。

p=str+strlen(name_first)-1;

strは配列であるため、配列名はベース アドレスを保持します。name_first配列の長さを加算1して減算すると、ポインタ演算が行われるため、結果が得られます。

変数を作成しましたcount = strlen(name_first)

strlenそのため、アドレスを に割り当てるために再度呼び出す必要はありませんp

より高速な方法については、使用するだけです

p=str+count-1;

于 2012-12-04T07:02:16.177 に答える
1

ステートメント:

p=str+strlen(name_first)-1;

str が指すメモリ内のアドレスを p に割り当てます。

したがって、str がアドレス 0x1000 から始まり、長さが 10 で、name_first の長さが 5 であるとします。その場合、p は 0x1004 を指します。

実行をループすると、0x1004、0x1003、0x1002、0x1001、および 0x1000 の文字が更新されるため、str の内容が更新されます。

これで疑問が解消されることを願っています。

于 2012-12-04T07:05:18.683 に答える
0

str は、str[10] の最初の要素のポインターです。このステートメントでは: "p=str+strlen(name_first)-1;" rhs はアドレスです

于 2012-12-04T07:06:01.897 に答える
0

char へのポインターである p には、p= 行の char 配列 str の最後の char のアドレスが割り当てられます。

次に、そのポインタを使用してそのメモリ ブロック内の char を操作し、操作メモリの内容を出力します (str は実際には char 配列への単なるポインタであるため)。

于 2012-12-04T07:06:04.983 に答える