鱼C论坛

 找回密码
 立即注册
查看: 1179|回复: 17

[已解决]我很好奇

[复制链接]
发表于 2023-8-4 14:28:53 | 显示全部楼层 |阅读模式
20鱼币
众所周知,c++二维数组可以这样写:
int a[100][100];
但是我今天发现,这样写也不会报错?
int a[100][100] = {0};
并且a[0]也不是0,这是怎么回事???0去哪了?
@高山 @元豪 @zhangjinxuan @liuhongrun2022 @编程追风梦
最佳答案
2023-8-4 14:28:54
#include <bits/stdc++.h>
using namespace std;

int main() {
        int a[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
        for (int i = 0; i < 3; ++i) {
                for (int j = 0; j < 3; ++j) {
                        printf("%d ", a[i][j]);
                }
                puts("");
        }
        return 0;
}

数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。

最佳答案

查看完整内容

数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:28:54 | 显示全部楼层    本楼为最佳答案   
#include <bits/stdc++.h>
using namespace std;

int main() {
        int a[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
        for (int i = 0; i < 3; ++i) {
                for (int j = 0; j < 3; ++j) {
                        printf("%d ", a[i][j]);
                }
                puts("");
        }
        return 0;
}

数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:29:08 | 显示全部楼层
本帖最后由 学习编程中的Ben 于 2023-8-4 14:34 编辑

问题:为什么在C++中使用 int a[100][100] = {0}; 声明二维数组后,a[0] 不是 0?

在C++中,当你声明一个二维数组并使用大括号进行初始化时,只有第一个维度的元素会被初始化为指定的值,而剩余的元素会被默认初始化为0。因此,对于 int a[100][100] = {0}; ,a[0] 并不是0,而是剩余元素都被默认初始化为0。

这是因为C++对于多维数组的初始化有特殊的规定。大括号初始化只会作用于数组的第一维,对于剩余维度的元素,默认初始化规则适用。

如果你希望所有的元素都被初始化为0,可以使用以下代码:
int a[100][100] = {{0}};
这样,在大括号内的0会递归地应用于每一个元素,确保整个二维数组中的元素都被初始化为0。

请注意,如果二维数组的元素类型不是基本数据类型(例如对象),默认初始化规则可能会有所不同,具体取决于元素类型的构造函数和默认构造函数的定义。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:29:08 | 显示全部楼层
这是因为在C++中,如果你声明一个数组并且为其提供了初始值,但是提供的初始值少于数组的大小,那么剩余的元素将会被默认初始化为0。

在你的例子中,你声明了一个100x100的二维数组 a ,并且为其提供了初始值 {0} 。这个初始值将会被用来初始化数组的第一个元素 a[0][0] ,而剩余的元素将会被默认初始化为0。所以 a[0][0] 是0,而其他的元素也都是0。

如果你想将数组的所有元素都初始化为0,你可以使用以下两种方法:

1. 使用循环来逐个赋值:
int a[100][100];
for(int i = 0; i < 100; i++) {
    for(int j = 0; j < 100; j++) {
        a[ i][j] = 0;
    }
}

2. 使用初始化列表来初始化数组:
int a[100][100] = {{0}};  // 所有元素都被初始化为0

希望能帮到你!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:29:14 | 显示全部楼层
问题:为什么在C++中 int a[100][100] = {0} 的情况下,a[0]不是0?

在C++中,当你声明并初始化二维数组时,只提供一个初始值时,该初始值将被用于所有元素。因此,在你的示例中,int a[100][100] = {0} 表示将所有元素初始化为0。

然而,a[0] 并不是指向整个二维数组的第一行,而是指向数组中的第一个一维数组(即 a[0][0])。因此,a[0] 的值实际上是第一个一维数组的地址,而不是它的内容。

如果你打印出 a[0] 的值,你将看到它是一个指针,指向 a[0][0] 的地址。要访问和修改特定的元素,你需要使用双重索引,如 a[0][1]、a[1][2] 等。

以下是一个示例代码,演示了这个问题:
#include <iostream>using namespace std;int main() {    int a[100][100] = {0};    cout << a[0] << endl;  // 输出第一个一维数组的地址    return 0;}
输出结果可能类似于:0x7ffc5caf5e40

如果你想将 a[0] 指向的一维数组中的所有元素都初始化为0,你可以使用循环来逐个初始化,例如:
int a[100][100];for (int i = 0; i < 100; i++) {    for (int j = 0; j < 100; j++) {        a[i][j] = 0;    }}
这样可以确保每个元素都被正确初始化为0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:35:01 | 显示全部楼层
不对啊,我记得这样写是初始化为0啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:35:31 | 显示全部楼层
a[0][0]是0啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:39:31 | 显示全部楼层

                               
登录/注册后可看大图

给个最佳答案呗!求你了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:43:27 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2023-8-4 14:45 编辑
并且a[0]也不是0,这是怎么回事???0去哪了?


你这个实验不严谨额
#include <bits/stdc++.h>
using namespace std;

int main() {
        int a[100][100] = {114514};
        printf("%d\n", a[0][0]);
        return 0;
}

输出的仍然是 114514。

而且对于二维数组而言,a[0] 是一个指针好不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 14:54:53 | 显示全部楼层
本帖最后由 编程追风梦 于 2023-8-4 14:59 编辑

长话短说,就撒原因:

1.就是零,要么你眼花了,要么你计算机眼花了
2. 为啥是零?来你看看这段代码来:“int a[100][100]”
这行代码声明了一个二维整数数组a,有100行和100列,但是你没明确地初始化数组,所以显然!数值未定义,你要是不懂的话,换句话说就是它的元素值是不确定的,可能是垃圾值,那么这个时候a值不确定,因为它们有可能是随机值啊,这就好比你从地下捡起来个苹果,而且还是被咬一口的,你说你吃不吃吧(疫情期间)
3.还没明白你看这个: “int a[100][100] = {0}”看见问题没?这行代码生命的东东跟上边一样,同时用0初始化了数组的所有元素,但是你注意你这里面用了单个0,不是两层括号的写法,所以即便你没有为每个元素都设定准确的初始值,但是这种写法还是会将数组所有元素都初始化为0
打个比方,a[0][0]、a[0][1]、a[0][2],以及其他所有元素初始化为0,
然后a[1][0]、a[1][1]、a[1][2]等等,也都被初始化为0,众所周知这玩意叫零初始化
好那么现在如果你不对数组进行初始化,数组的元素值就是未定义的,可能是任意的随机值,也就是你吃了那个苹果,你有一定的概率去找上帝愉快地玩耍,也有概率去医院办至尊VIP年卡,所以,为了确保数组中的元素有明确定义的值,也为了确保你能在家老老实实的做作业不去办卡也不去玩耍,建议在声明数组时进行初始化,也建议你把那个苹果扔了,或者在之后对每个元素明确赋值

哦对了,你要是查明白这个苹果没毒,咱商量商量,你送我行不?

求求给个最佳答案!别人都有了,我这个月还没业绩呢~呜呜呜


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-4 15:11:03 | 显示全部楼层
编程追风梦 发表于 2023-8-4 14:54
长话短说,就撒原因:

1.就是零,要么你眼花了,要么你计算机眼花了

兄弟咱就是说,咱们说的不是一件事,你在讲怎么初始化默认值全是0,不然怎么怎么样,我都懂,就是不懂那个0哪去了,有人帮我解答了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-4 15:11:47 | 显示全部楼层
zhangjinxuan 发表于 2023-8-4 14:28
数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。

懂了,是线性的,原来如此
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 15:15:29 | 显示全部楼层
zhangjinxuan 发表于 2023-8-4 14:28
数组在内存存放是线性的,不管是二维还是三维,只是人定义的一个标准罢了。

我很好奇,你怎么比脚本还快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 15:20:18 | 显示全部楼层
isdkz 发表于 2023-8-4 15:15
我很好奇,你怎么比脚本还快

哪里比脚本快?

肯定是脚本有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 15:24:07 | 显示全部楼层
zhangjinxuan 发表于 2023-8-4 15:20
哪里比脚本快?

肯定是脚本有问题

不可能吧,脚本应该在十几秒内就回复了,但是你为什么在二楼的位置,难不成你看帖子思考加打字的时间就十几秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 15:25:11 | 显示全部楼层
isdkz 发表于 2023-8-4 15:24
不可能吧,脚本应该在十几秒内就回复了,但是你为什么在二楼的位置,难不成你看帖子思考加打字的时间就十 ...


https://fishc.com.cn/forum.php?mod=viewthread&tid=229010
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 15:27:47 | 显示全部楼层
zhangjinxuan 发表于 2023-8-4 15:25
https://fishc.com.cn/forum.php?mod=viewthread&tid=229010

好吧,看来是系统bug,有时候被设为最佳不会被改成2楼的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-4 15:51:35 | 显示全部楼层
陈尚涵 发表于 2023-8-4 15:11
兄弟咱就是说,咱们说的不是一件事,你在讲怎么初始化默认值全是0,不然怎么怎么样,我都懂,就是不懂那 ...

呜呜呜,好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 02:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表