#include <iostream>
#include <cstdlib>
using namespace std;
void reverse(char* str){
char *end = str;
char tmp;
if(str){
cout << "hello" << endl;
while(*end){
cout << end << endl;
++end;
}
--end;
while (str < end){
tmp = *str;
*str++ = *end;
*end-- = tmp;
}
}
}
int main(){
char str[] = "helloyouarefunny";
string input = str;
reverse(str);
for(int i = 0; i < input.length(); i++) {
cout << str[i];
}
}
if(str){}
是否等同于if(str == NULL){}
?while(*end){}
意味着什么,它到底在做什么?我想我已经大致了解,只要没有&#34;看到&#34;就会继续执行while循环。一个'\0'
。但是我不确定这行代码是什么完全。if(str){}
是if(str == NULL){}
的等效语句,您会将哪些内容传递给函数str = NULL
?例如,在我的main(){}
中,我尝试执行char str[] = NULL
,从而尝试传递NULL,以便它不会进入代码if(str == NULL){}
。但我得到一个错误,说我无法发表此声明char str[] = NULL
。所以我的问题是为什么我会收到此错误以及我可以通过reverse()
函数传递什么才能使if(str){}
内的代码无法执行?我希望这个问题有道理。 ++end
正在做指针算法吗?所以每次递增时,地址都会移动到它旁边的地址?while(str < end){}
。仅str
和*str
之间有什么区别?我理解cout << str << endl;
与重载运算符<<
有关,因此会打印通过参数传递的整个字符串。但是,为什么,当我cout << *end << endl;
时,它只在该内存地址打印字符?所以我的问题是,两者之间的区别是什么?当我*str
时,它只是解除引用吗?在这个问题中,我实际上可能会问的不只是那个问题。我希望我不要混淆你们&gt; _&lt;。 答案 0 :(得分:2)
if(str){}
是否等同于if(str == NULL){}
?
不,if(str){}
相当于if(str != NULL){}
while(*end){}
意味着什么,它到底在做什么?
由于end
的类型为char*
,while(*end){}
相当于while (*end != '\0')
。对输入字符串的所有字符执行循环。当到达字符串的末尾时,循环停止。
鉴于
的等效陈述if(str){}
是if(str == NULL){}
这是不正确的。我没有读过段落的其余部分,因为你开始时声明不正确。
代码
++end
正在做指针算法吗?所以每次递增时,地址都会移动到它旁边的地址?
排序。 end
的值递增。它指向它在操作之前指向的下一个对象。
我有点困惑
while(str < end){}
在之前的while
循环中,end
从str
开始递增,直到它到达字符串的末尾。在此循环中,end
递减,直到它到达字符串的开头。当end
到达str
时,while
语句的条件值将计算为false
并且循环中断。
<强>更新强>
关于
你会将什么传递给函数
str = NULL
?
您可以直接致电
reverse(NULL);
我尝试
char str[] = NULL;
str
是一个字符数组。它可以使用几种方式初始化:
// This is what you have done.
char str[] = "helloyouarefunny";
// Another, more tedious way:
char str[] = {'h','e','l','l','o','y','o','u','a','r','e','f','u','n','n','y', '\0'};
注意第二种方法中存在明确指定的空字符。
您无法将类型为char
的数组的变量初始化为NULL。该语言不允许这样做。您可以将指针初始化为NULL但不是数组。
char* s1 = NULL; // OK
reverse(s1); // Call the function
s1 = malloc(10); // Allocate memory for the pointer.
strcpy(s1, "test") // Put some content in the allocated memory
reverse(s1); // Call the function, this time with some content.
答案 1 :(得分:1)
这些是非常标准的C编程习语。
if (str) ...
相当于if (str != NULL) ...
{'H', 'e', 'l', 'l', 'o', '\0'}
。与指针一样,逻辑表达式中的0或NULL值被视为false
。因此,只要while (*end) ...
未到达空字符,while
就会执行end
循环的主体。end
指向字符串末尾的一个,str
指向开头。现在我们将这两个指针相互交叉,交换字符。答案 2 :(得分:0)
1/2)在C和C ++中,if
或while
中的任何内容都被评估为布尔值。当{em>任何其他值被评估为true时,0
被评估为false。鉴于NULL
相当于0
,if(str)
和if(str != NULL)
执行相同的操作。
同样,只要while(*end)
指向的值不会评估为end
,0
才会循环播放。
3)如果您将char
指针传递给此函数,它可能是空指针(char *str = 0
),因此您要检查以确保str
不是{{ 1}}。
4)是的,然后指针指向内存中的下一个位置,直到最终在字符串末尾找到null
。
5)也许你的困惑是基于代码缺少括号的事实,循环应该如下:
null
这样两个指针将继续朝着彼此方向前进,直到穿越路径(此时while (str < end){
tmp = *str;
*(str++) = *end;
*(end--) = tmp;
}
将不再小于str
)