C 指针,了解如何将数组传递给函数

C Pointers, understanding how to pass arrays to function

我目前正在为即将到来的测试修改 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 .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 != '[=10=]')//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((char*)string);。只是一个隐式类型转换规则。

具有数组类型的函数参数由编译器调整为指向数组元素类型的指针类型。

例如这两个函数声明

void convertToUppercase(char sPtr[]);

void convertToUppercase(char *sPtr);

声明同一个函数。

您可以在程序中包含这两个声明,但编译器可能会发出一条消息,指出同一函数存在冗余声明。

另一方面,表达式中使用的数组指示符(例如在 sizeof 运算符中使用)被转换为指向其第一个元素的指针。

所以这个函数调用

convertToUppercase(string)

相当于下面的函数调用

convertToUppercase( &string[0] )

注意,函数声明和定义如下方式会更好

char * convertToUppercase( char s[] )
{
    for ( char *p = s; *p; ++p )
    {
        *p = toupper( ( unsigned char )*p );
    }

    return s;
}