user-0 提问: 愚蠢的我又来了，关于指针的一道作业题~~

回复:
user: user-0
content: 引用 8 楼 wang0635 的回复:引用 7 楼 qq_32874397 的回复:引用 6 楼 wang0635 的回复:引用 5 楼 qq_32874397 的回复:引用 4 楼 wang0635 的回复:[quote=引用 3 楼 qq_32874397 的回复:] [quote=引用 1 楼 wang0635 的回复:] 第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛也是设一个中间变量然后再交换就行了吗对呀，你试试。不过，交换一半就行了，记住不要交换多了多谢你，顺便想请教个问题，为什么不用中间变量就不行呢，然后我第一个程序输入abcdefg的话结果是abcdcba，为什么只有后半段倒序，前半段不改变呢。使用中间变量，第一个被修改的变量的值才能暂时保存到中间变量中，下一步再把它存入第二个变量；如果不用中间变量，直接将第二个变量的值存入第一个变量，它们变成一样的了，第一个变量原来的值就找不到了void reverse(char *p)  { 	int i,j; 	char p_2; 	for(i=0;*(p+i)!='\0';i++)continue; 	i--;                        //统计出字符串元素的个数 	for(j=0;i>j;i--,j++) 	{p_2=*(p+i);//依次将该字符串最后的地址指向第一位地址，倒数第二个地址指向第二个。。。。     *(p+i)=*(p++);     *p++=p_2; 	}      }这样改还是不知道哪错了。。[/quote]最后的for循环中，p都变化了，i、j也变化，p+i就跑得快了。把两个p++改成(p+j)[/quote]感谢耐心的解答，恍然大悟，但又突然觉得自己好蠢。。

user: user-1
content: 闪开，都瞎说 #include <stdio.h>  void reverse(char *p); int main(void) { 	char str[80]={0};//规范化，定义数组得初始化 	puts("a sting:"); 	gets(str); 	reverse(str); 	puts(str); 	return 0; } void reverse(char *p)  { 	int i; 	char *p_1=p; 	for(i=0;*(p+i)!='\0';i++)continue; 	i--;                        //统计出字符串元素的个数 	int j=i/2; 	for(;i>j;i--) 	{ 		*(p+i)+=*(p_1); 		*p_1=*(p+i)-*p_1; 		*(p+i)=*(p+i)-*p_1; 		p_1++; 	} }

user: user-2
content: 引用 7 楼 qq_32874397 的回复:引用 6 楼 wang0635 的回复:引用 5 楼 qq_32874397 的回复:引用 4 楼 wang0635 的回复:引用 3 楼 qq_32874397 的回复:[quote=引用 1 楼 wang0635 的回复:] 第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛也是设一个中间变量然后再交换就行了吗对呀，你试试。不过，交换一半就行了，记住不要交换多了多谢你，顺便想请教个问题，为什么不用中间变量就不行呢，然后我第一个程序输入abcdefg的话结果是abcdcba，为什么只有后半段倒序，前半段不改变呢。使用中间变量，第一个被修改的变量的值才能暂时保存到中间变量中，下一步再把它存入第二个变量；如果不用中间变量，直接将第二个变量的值存入第一个变量，它们变成一样的了，第一个变量原来的值就找不到了void reverse(char *p)  { 	int i,j; 	char p_2; 	for(i=0;*(p+i)!='\0';i++)continue; 	i--;                        //统计出字符串元素的个数 	for(j=0;i>j;i--,j++) 	{p_2=*(p+i);//依次将该字符串最后的地址指向第一位地址，倒数第二个地址指向第二个。。。。     *(p+i)=*(p++);     *p++=p_2; 	}      }这样改还是不知道哪错了。。[/quote]最后的for循环中，p都变化了，i、j也变化，p+i就跑得快了。把两个p++改成(p+j)

user: user-0
content: 引用 6 楼 wang0635 的回复:引用 5 楼 qq_32874397 的回复:引用 4 楼 wang0635 的回复:引用 3 楼 qq_32874397 的回复:引用 1 楼 wang0635 的回复:第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛也是设一个中间变量然后再交换就行了吗对呀，你试试。不过，交换一半就行了，记住不要交换多了多谢你，顺便想请教个问题，为什么不用中间变量就不行呢，然后我第一个程序输入abcdefg的话结果是abcdcba，为什么只有后半段倒序，前半段不改变呢。使用中间变量，第一个被修改的变量的值才能暂时保存到中间变量中，下一步再把它存入第二个变量；如果不用中间变量，直接将第二个变量的值存入第一个变量，它们变成一样的了，第一个变量原来的值就找不到了void reverse(char *p)  { 	int i,j; 	char p_2; 	for(i=0;*(p+i)!='\0';i++)continue; 	i--;                        //统计出字符串元素的个数 	for(j=0;i>j;i--,j++) 	{p_2=*(p+i);//依次将该字符串最后的地址指向第一位地址，倒数第二个地址指向第二个。。。。     *(p+i)=*(p++);     *p++=p_2; 	}      }这样改还是不知道哪错了。。

user: user-2
content: 引用 5 楼 qq_32874397 的回复:引用 4 楼 wang0635 的回复:引用 3 楼 qq_32874397 的回复:引用 1 楼 wang0635 的回复:第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛也是设一个中间变量然后再交换就行了吗对呀，你试试。不过，交换一半就行了，记住不要交换多了多谢你，顺便想请教个问题，为什么不用中间变量就不行呢，然后我第一个程序输入abcdefg的话结果是abcdcba，为什么只有后半段倒序，前半段不改变呢。使用中间变量，第一个被修改的变量的值才能暂时保存到中间变量中，下一步再把它存入第二个变量；如果不用中间变量，直接将第二个变量的值存入第一个变量，它们变成一样的了，第一个变量原来的值就找不到了

user: user-0
content: 引用 4 楼 wang0635 的回复:引用 3 楼 qq_32874397 的回复:引用 1 楼 wang0635 的回复:第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛也是设一个中间变量然后再交换就行了吗对呀，你试试。不过，交换一半就行了，记住不要交换多了多谢你，顺便想请教个问题，为什么不用中间变量就不行呢，然后我第一个程序输入abcdefg的话结果是abcdcba，为什么只有后半段倒序，前半段不改变呢。

user: user-2
content: 引用 3 楼 qq_32874397 的回复:引用 1 楼 wang0635 的回复:第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛也是设一个中间变量然后再交换就行了吗对呀，你试试。不过，交换一半就行了，记住不要交换多了

user: user-0
content: 引用 1 楼 wang0635 的回复:第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛也是设一个中间变量然后再交换就行了吗

user: user-3
content: void reverse(char* p) {     assert(p != NULL);     int n = strlen(p);     int from = 0;     int to = n - 1;     for(; from < to; from++, to--)     {         char tmp = p[from];         p[from] = p[to];         p[to] = tmp;     } }

user: user-2
content: 第一次写的，为什么没有交换指针所指的内容呢？第二次写的交换了就没有问题了嘛