我是C语言的新手,我正在指点.所以,我不知道如何通过指针获取WHOLE字符串.如果指针只包含字符串中第一个字符的地址,它如何返回整个字符串?
假设我们有类似的东西 char *s = "Test";
因为它只是一个字符数组,它位于内存中的某个位置,如下所示:
字符串:T est\0
地址:100 101 102 103 104
所以,如果我做对了,*s就会保留100(第一个字符的地址T).
那么为什么当我们这样printf(s);做时,我们Test在输出中得到整个字符串?
它会扫描地址直到它遇到\0,还是会做其他事情?
我们如何通过指针获取整个字符串
是的,OP在评论中很清楚要打印字符串内容,输出开始s[0]并持续到s[i]零.在最后一个元素串,该空字符不打印.
注意:printf(s)是错误的代码,因为printf()期望第一个参数不仅是指向字符串的指针,而且会解释为格式.如果'%'发生a ,则后面的字符将被解释为说明符@MM.代替:
printf("%s", s);
// or
fputs(s, stdout);
Run Code Online (Sandbox Code Playgroud)
类似的功能strlen(), strcpy(), strcat()也花费相当多的时间沿着字符串的长度走来确定它的长度.对于长串,这可能需要相当长的时间.
这种繁琐的绳索长度可能会产生严重的影响.考虑s指向一串长度的点n.
for (i=0; i<strlen(s); i++) {
s[i] = 'x';
}
Run Code Online (Sandbox Code Playgroud)
与
for (i=0; s[i] != '\0'; i++) {
s[i] = 'x';
}
Run Code Online (Sandbox Code Playgroud)
第一个代码片段编译可能看不到每次迭代时字符串的长度不会改变(因为字符串被更改),然后是调用strlen(n) n次数,每次调用n操作或总O(n*n) 时间.第二个代码只接受n操作O(n)时间的顺序.
高效的C代码识别这一点并避免重复长度计算.
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |