【问题标题】:C Pointers, understanding how to pass arrays to functionC指针,了解如何将数组传递给函数
【发布时间】: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(&amp;string[0]);。在这些表达式中,数组被称为“衰减”到一个指针。
  • 我也是这么想的。但是为什么整个数组都传入函数中呢?如果您使用“字符串”作为输入,它不会只将第一个元素传递给函数吗?整个数组是怎么传进去的?
  • 只有指向第一个元素的指针被传递给函数。该数组在字符串的最后一个字符之后包含一个空终止符,因此该函数可以查找空终止符。
  • 我明白了!这意味着指向第一个元素的指针被传入。但是由于 while 循环和条件为 NULL,它将继续遍历整个数组,直到它到达 NULL 字符(条件满足?)这意味着整个数组不需要传入函数,只需要指向第一个元素的指针?
  • 如果标题解决了您的问题,您应该accept an answer,而不是在标题中添加“已解决”。

标签: arrays c pointers implicit-conversion function-call


【解决方案1】:

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

例如这两个函数声明

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;
}

【讨论】:

  • 感谢您的及时回复!在程序中,整个数组被传递给函数。怎么会这样?我认为只有第一个元素被传递到函数中。
  • @FermiToh 由于数组的所有元素都相邻存储,因此拥有指向数组第一个元素的指针,您可以使用指针算法访问数组的任何元素,例如在下标运算符。
  • 我明白了!非常感谢好心的先生!非常感谢您的帮助!
【解决方案2】:

数组在传递给函数时会自动转换为指针。就像你写过convertToUppercase((char*)string);一样。只是多了一个隐式类型转换规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多