【问题标题】:How can I pass an array to a function that cannot modify it?如何将数组传递给无法修改它的函数?
【发布时间】:2020-06-01 04:43:44
【问题描述】:

我正在用 C 语言编程,我想将一个数组传递给一个函数;此函数不能修改数组的元素。函数参数的正确语法是什么?

void func(const Foo array_in[])

void func(Foo const array_in[])

或者它们可能是一样的? 谢谢。

【问题讨论】:

  • 您不能将数组传递给函数,而是将指针传递给它的第一个元素。两种形式都是正确的,你可以使用任何一种。
  • 请注意,使用const 限定参数类型只能帮助程序员避免无意中修改数组元素。如果他们故意将指针转换为非 const 类型并使用它来修改元素,C 标准允许这样做。所以这个声明不会给你函数不能修改数组元素的情况,只是建议或指示它不应该这样做的情况。
  • @hacks 好奇,回复:“您不能将数组传递给函数,而是将指针传递给它的第一个元素”。对于printf("%f\n", 123.4f);,您是否还说不能将float 传递给printf()? (假设float 在调用之前转换为double。)

标签: c arrays pointers constants


【解决方案1】:

您应该使用指向常量的指针来处理:

#include<stdio.h>

void fun(const int *ptr)//pointer to constant - array boils down to pointer when passed to function
{
    ptr[0]=9;        //ERROR: Read-Only
}

int main(void)
{
    int arr[]={1,2,3,4};

    fun(arr);
    return 0;    
}

注意:不要将它与常量指针

混淆

【讨论】:

  • 为什么要使用“指向常量的指针”?问题中的声明有什么问题?
  • void func(const Foo array_in[])void func(Foo const array_in[]) 已经使用了 pointer to constant。这个答案只是建议一种不同的风格。
【解决方案2】:

首先,const Foo array_in[]Foo const array_in[] 在 C 中的声明完全相同。

其次,当函数的参数类型为“T的数组”类型时,会自动调整为“指向T的指针”类型。所以编译器假装你写的是:

void func(const Foo *array_in)

或等效

void func(Foo const *array_in)

请注意,const Foo *array_inFoo const *array_in 在 C 中的含义完全相同(指向 const Foo 的指针)。但是,Foo * const array_in 的含义不同(指向 Foo 的 const 指针)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2019-10-19
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多