gpt4 book ai didi

c - 声明没有最高维度的数组

转载 作者:太空狗 更新时间:2023-10-29 16:07:54 24 4
gpt4 key购买 nike

如果这样声明,整数数组 arr 的维数是多少:

int arr[][2]={1,2,3};

不声明最高维度有什么用?

最佳答案

令我有些吃惊的是,您的声明:

int arr[][2]={1,2,3};

似乎是合法的。您可以合法地省略初始值设定项中的内括号。例如,如果你想显式定义 arr 的边界并初始化它的所有元素,你可以这样写:

int arr[2][2] = { { 1, 2}, { 3, 4 } };

或者,等价地:

int arr[2][2] = { 1, 2, 3, 4 };

您也可以省略尾随元素,它们将被隐式设置为零。对于一维数组,这很简单;这个:

int arr[4] = { 1, 2, 3 };

相当于:

int arr[4] = { 1, 2, 3, 0 };

如果你省略了一个维度,它可以从初始化器中推断出来:

int arr[] = { 1, 2, 3, 4 }; // 4 elements

由于您将 arr 定义为 int 的 2 元素数组,因此:

int arr[][2]={1,2,3};

等同于:

int arr[][2] = { { 1, 2 }, { 3 } };

你在初始化器中有两个元素(每个元素初始化一个 2 元素数组),所以这等同于:

int arr[2][2] = { { 1, 2 }, { 3 } };

最后,您省略了最后一个初始化子元素,因此它隐式为零:

int arr[2][2] = { { 1, 2 }, { 3, 0 } };

一般来说,省略维度和尾部初始值设定项是有用的,因为它可以让编译器找出某些事情。如果我写:

char message[] = "hello, world";

我不必计算字符串中的字符数(并为终止 '\0' 添加 1)。计算机真的很擅长计数;让人类来做这项工作是愚蠢的。

同样,省略一些初始值设定项可让您仅提供所需的信息。通过 C99 添加的指定初始化程序,您甚至可以初始化结构的指定成员,让编译器处理其他所有事情:

struct foo obj = { .something = 42 };

至于通过省略内部花括号来扁平化初始化器,我个人认为除了使用 { 0 } 初始化器初始化整个数组或结构的特殊情况外,它没有多大用处零。特别是,对于多维数组,我发现显示数组的整个结构更清晰。

关于c - 声明没有最高维度的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18134594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com