取决于不同的字符串声明方式,有几种方法可以把字符串的地址传递给函数。在本节中,我们会利用一个模拟strlen
的函数说明这些技术,该函数的实现如下代码所示。我们用括号来强制后面的自增操作符先执行,使得指针加1。否则加1的就是string
引用的字符了,这不是我们想要的结果。
size_t stringLength(char* string) {
size_t length = 0;
while(*(string++)) {
length++;
}
return length;
}
注意 字符串实际上应该以
char
常量的指针的形式传递,5.3.2节会讨论这一点。
让我们从下面的声明开始:
char simpleArray[] = "simple string";
char *simplePtr = (char*)malloc(strlen("simple string")+1);
strcpy(simplePtr, "simple string");
要对这个指针调用此函数,只要用指针名字即可:
printf("%d\n",stringLength(simplePtr));
要使用数组调用函数,我们有三种选择,如下所示。在第一个语句中,我们用了数组的名字,这会返回其地址。在第二个语句中,显式使用了取地址操作符,不过这样写有冗余,没有必要,而且会产生警告。在第三个语句中,我们对数组第一个元素用了取地址操作符,这样可以工作,不过有点繁琐:
printf("%d\n",stringLength(simpleArray));
printf("%d\n",stringLength(&simpleArray));
printf("%d\n",stringLength(&simpleArray[0]));
图5-12说明了stringLength
函数的内存分配情况。
现在让我们把注意力转移到形参的声明方式上。在前面stringLength
的实现中,我们把参数声明为char
指针,不过也可以像下面这样用数组表示法:
size_t stringLength(char string[]) { ... }
函数体还是一样,这个变化不会对函数的调用方式及其行为造成影响。