鱼C论坛

 找回密码
 立即注册
查看: 2623|回复: 12

C++初始化数组的方法

[复制链接]
发表于 2020-10-17 22:37:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>

int main(void)
{
        double (*pa) = {1, 2, 3, 4, 5}; //这会报错
        return 0;
}

有谁能说一下为啥这会报错么?是啥道理?我可以这样写么:double (*pa) = &{1, 2, 3, 4, 5}; //把这个数组的首地址赋给数组指针

C++ 的数组初始化??????????


double arr[] = {0}; // 默认全0填充

只能这样写吗??????????

要用数组指针来初始化(指向首地址),怎么写??谢谢!

double (*pa) = new double[4];
double arr = new double[4];

这两种写法有啥区别?为啥C++不允许数组声明后初始化?

double arr[4];
arr = {1, 2, 3, 4}; // 这样写也无法通过编译。。。为啥??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-17 22:40:35 | 显示全部楼层
大括号形式设置初值只能设置一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 22:44:39 | 显示全部楼层
昨非 发表于 2020-10-17 22:40
大括号形式设置初值只能设置一个

啥?大佬能说详细点吗,先看清我的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 22:47:22 | 显示全部楼层
川建军 发表于 2020-10-17 22:44
啥?大佬能说详细点吗,先看清我的问题

double arr[5] = {0}; // {0, 0, 0, 0, 0}
double arr[5] = {1}; // {1, 0, 0, 0, 0}

是这样吗?这个当然知道。我的问题是,能不能用一个数组指针对数组初始化

比如

double (*pa) = {1, 2, 3, 4};
为啥这样写会报错呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 22:48:20 | 显示全部楼层
川建军 发表于 2020-10-17 22:44
啥?大佬能说详细点吗,先看清我的问题

我只能肯定double (*pa) = {1, 2, 3, 4, 5};这种赋初值的方法里{}只能有一个值
至于下面你问的,c++这块我只有入门水平,不清楚的不敢乱说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 22:49:17 | 显示全部楼层
@风过无痕1989 你来看看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 23:00:06 | 显示全部楼层
另外用new 初始化数组和直接赋值有啥区别吗?new的是在heap(堆)上进行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-17 23:11:53 | 显示全部楼层
C++中
花括号{}都是用来列表初始化的吗?
比如new double[5]{1, 3, 5, 7, 9}; //这句话中花括号内的就是列表初始化

问一下new出来的数组和直接arr [5] = {1, 3, 5, 7, 9}有啥区别!

另外C++中,为啥不允许下面的写法(先声明,后赋值不行;必须在声明的时候就初始化好,或者只能对某个元素赋值)

double arr[5]; // declare an array with 5 elements
arr = {1, 3, 5, 7, 9}; //这会报错!
我的理解是arr代表的是首元素的地址,所以等号两边类型不等
而Java可以直接赋值,因为Java中的数组实际上是一个“对象”,arr表示该对象的"引用"(Java中的类C封装指针),是可以直接调用的,比如arr.length这类方法都是可以直接调用的,而C/C++因为是元素地址,所以不行。我的理解正确吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 23:55:15 | 显示全部楼层
昨非 发表于 2020-10-17 22:49
@风过无痕1989 你来看看吧

还没下班呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-18 00:03:15 | 显示全部楼层

啊,你是上班族啊?我以为你是学生呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-18 01:11:10 | 显示全部楼层
昨非 发表于 2020-10-18 00:03
啊,你是上班族啊?我以为你是学生呢

你不也是上班吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-18 07:36:51 From FishC Mobile | 显示全部楼层
川建军 发表于 2020-10-18 01:11
你不也是上班吗

我是在校学生
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-18 16:00:05 | 显示全部楼层
本帖最后由 xieglt 于 2020-10-18 16:18 编辑

c++里头,
只有字符串是可以这样定义,其他类型都不行。
char * pstr = "Hello,world";
这是因为 "Hello,world" 编译的时候被定义为已初始化数据,程序运行时会作为静态数据载入内存。
而且  pstr 是只读的 ,想修改 pstr 里的内容,如  pstr[0] = 'A' ; 这样的代码会造成非法内存访问异常
其他类型的常量数据都不会被作为已初始化数据。
double 类型的数组初始化有以下几种方式。
double   arr[5] = {1,2,3,4,5};
double   arr[] = {1,2,3,4,5};
double * arr = new double[5];
for(int i = 0 ; i < 5 ; i ++)
{ 
      arr[i] = i;
}
以下几种都是错的。

double * arr = {1,2,3,4,5}         // arr没有分配内存
double * arr = new double[5] { 1,2,3,4,5};     //arr分配了内存,但是不能这么赋初值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 23:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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