【发布时间】:2020-07-31 21:50:03
【问题描述】:
void uc(char* s)
{
int i;
for( i=0; i < strlen(s); i++ )
if (97 <= s[i] && s[i] <= 122)
s[i] = s[i] - 32;
return;
}
我的教授向我们班展示了这个运算符。
char* s 复制一个数组,这没关系,因为数组名是它的第一个元素内存地址。
现在我的问题是:为什么我们将指针s 视为for 循环中的数组?
指针存储地址,但我了解到它们没有非常直观的行为......
我的问题是我将它们视为“一个 int 变量”,因为内存地址是十六进制格式的整数(对吗?),但我知道这不是那么简单。
编辑:谢谢大家的回答,我喜欢这个网站和社区
【问题讨论】:
-
嗯。
char *s不是运算符,而是定义。如果您有一个 char 数组char name[] = "Giuseppe"然后调用uc(name),那么该数组将由指向其第一个元素的指针表示,但不会复制任何内容。如果您现在更改s[i]或*s,您将修改原始数组通过指针s。 -
@MOehm,我的意思是 uc 作为一个运算符(函数),无论如何,从你写的内容来看,你的意思是 *s 被定义为“地址数组”,它的数组维度相同代表?
s不是只存储一个地址吗?编译器怎么知道s[i]是什么? -
有些建议看起来很正常。首先 -
strlen(s)现在在每次迭代中计算。您可以在for循环之前将其分配给变量,例如int len = strlen(s)然后使用len或反转循环for ( i = strlen(s) - 1; i >= 0; i-- )。第二 - 均衡比较if ( s[i] >= 97 && s[i] <= 122 )(将变量和常量放在固定位置)。 -
我建议您阅读 Kernighan 和 Ritchie 所著的The C Programming Language 2nd edition 一书的第 5 章(指针和数组)。