在C中,如果我使用数组作为函数的参数,数组大小没有意义,因为数组名作为指针

问题描述 投票:0回答:1

据我所知

int func(int arr[5]) {
    printf("Test");
}

方括号中的数组大小(例如 5)没有任何意义,因为 arr 只是指向数组第一个元素的指针,即它与

相同
int func(int *arr) {
    printf("Test");
}

int func(int arr[]) {
    printf("Test");
}

但是,如果数字本身没有任何意义,为什么可以在方括号中写下 5 这样的数字呢?

arrays c size
1个回答
0
投票

确实,数组符号被调整(“衰减”)为指向第一个元素的指针,使所有 3 个示例等效。该语言的设计方式是为了使表达式中的数组使用与函数兼容,因为当在大多数表达式中使用数组时,它也会“衰减”为指向第一个元素的指针。

尺寸确实有点意义:

  • 它是自记录代码。
  • 它可以帮助诊断工具(编译器和/或静态分析器)找到数组参数不匹配的情况。

您可以通过声明参数

int arr[static 5]
来稍微提高类型安全性,其中
static
表示传递 至少 5 个项目,而不是空指针。现代编译器可能会给出诊断消息:

#include <stdio.h>

void func(int arr[static 5]) 
{
  printf("Test");
}

int main(void)
{
  int a[5];
  func(a); // ok

  int* b;
  func(b); // accepted

  int c[4];
  func(c); // not ok

  func(NULL); // not ok
}

您还可以将参数声明为指向数组的指针

int (*arr)[5]
。这进一步提高了类型安全性,因为这意味着 必须传递恰好 5 个 int 的数组。但这使得该函数使用起来更加麻烦,因为在使用它时您必须将参数取消引用为
(*arr)[i]
。数组参数必须作为
func(&a)
传递。

© www.soinside.com 2019 - 2024. All rights reserved.