【发布时间】:2020-12-07 17:04:28
【问题描述】:
我目前正在为即将进行的测试修改 C 指针,并且在浏览讲座幻灯片时遇到了一个相当有趣的程序。
#include <stdio.h>
#include <ctype.h>
void convertToUppercase(char *sPtr);//function prototype, input is a dereferenced pointer
int main(void)
{
char string[] = "cHaRaCters and $32.98";
printf("The string before conversion is %s\n", string);
convertToUppercase(string); //Why can I just input the string array into the function? I don't need a pointer?
printf("The string after conversion is %s", string);
}
void convertToUppercase(char *sPtr)
{
while (*sPtr != '\0')//Clearly see the NULL terminating character, means the entire array is passed to the function.
{
*sPtr = toupper(*sPtr);
sPtr++;
}
}
我不明白的是这一行:convertToUppercase(string);
函数原型需要 (char *sPtr) 作为输入,但在这种情况下,字符串数组只是传递给函数调用。怎么样?
我真的不明白这是如何工作的。谁能帮我更好地理解这段代码?
我的猜测是数组名本身 'string' 已经包含了整个数组本身的地址(这就是为什么当我们为数组分配指针时我们不放 '&')
提前谢谢你,保重!
【问题讨论】:
-
在大多数表达式中,数组被转换为指向其第一个元素的指针,因此
convertToUppercase(string);等价于convertToUppercase(&string[0]);。在这些表达式中,数组被称为“衰减”到一个指针。 -
我也是这么想的。但是为什么整个数组都传入函数中呢?如果您使用“字符串”作为输入,它不会只将第一个元素传递给函数吗?整个数组是怎么传进去的?
-
只有指向第一个元素的指针被传递给函数。该数组在字符串的最后一个字符之后包含一个空终止符,因此该函数可以查找空终止符。
-
我明白了!这意味着指向第一个元素的指针被传入。但是由于 while 循环和条件为 NULL,它将继续遍历整个数组,直到它到达 NULL 字符(条件满足?)这意味着整个数组不需要传入函数,只需要指向第一个元素的指针?
-
如果标题解决了您的问题,您应该accept an answer,而不是在标题中添加“已解决”。
标签: arrays c pointers implicit-conversion function-call