查看: 117|回复: 0

C++数组

[复制链接]

5

主题

13

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2023-4-9 18:42:37 | 显示全部楼层 |阅读模式
数组名字是指针(在之前文章里有指针介绍),数组名字+索引就是该数组类型的值
int a[8]; //8个整数的数组
cout << a << endl; //打印数组地址,a是指针,
cout << a[4] << endl; //打印a[4]的值,寻址方法是指针地址+16字节,4个整数大小
a[2] = 10;
//就是在a的内存地址上加8个字节。等价于如下
*(a + 2) = 10;
//指针加法的规则,+1就等于+指针类型大小,这里是整数,所以+1=+4字节
//在堆上创建数组
int* a = new int[5];
//堆上的数组直到程序结束或者被delete才会被删除,而栈上的超出范围就会被删除,所以new出来的生命周期更长,而且如果函数需要return一个数组,那么new出来的就可以很好的传递,
delete[] a;本人亲测,在栈上面创建的数组,传回去即使是地址,但是一旦返回,这个数组就会消灭,无法找到。一开始我返回数组以后,就打印c[3],神奇的是居然打印出来,但是打印完就消灭了,我想了半天都没想通,然后我把c[3]的打印放在后面,我先打印一个新建的变量d,结果发现打印d后c[3]不对了,数组没了,这才是我想要的结果,也印证了确实在栈上创建时不行的,指针丢失了。我猜测是cout 函数的某种原因使得直接打印还能打出来,挺离谱的。在堆上面就不会有任何问题,一直都对的。
int* ForInt(int n[])
{
    int c[4];
    c[3] = 100;
    return c;
}

int main()
{
    int* b = new int[6];
    int* c;
    c = ForInt(b);
    int d = 200;
    cout << d;
    cout << c[3];
    return 0;
}栈和堆数组的间接寻址,如果我们在类中创建数组,在栈上面创建不会有任何问题,实例化对象所在地址会包含所有的数组数据,但是如果是new出来的,那么对象就只会包含该指针的地址,然后指向另一个地址,才能访问到数组
class Entity
{
public:
    int a[5];
    int* b = new int[5];
    Entity()
    {
        for(int i = 0; i < 5; i++)
            a = 2;
    }
};

int main()
{
    Entity e;//int a[5]的创建会使得e的内存中有5个2
    Entity e1;//b[5]的创建使得e1的内存中有b[5]的地址,导致重定向,削减性能,还可能导致缓存丢失或者内存碎片
}我们在堆上创建数组,没有array->size这种方法来得到数组大小,虽然他的大小可能存在数组的负数索引位置,因为delete的时候需要知道多大,但是这种访问很危险,所以别这样做
//在栈上面的可以这么获取大小
int a[5];
int* example = new int[6];
int count = sizeof(a) / sizeof(int); //5
int count1 = sizeof(example) / sizeof(int); //得到1,4/4所以在C++中我们应当自己维护数组大小,当然C++11的array也可以
class Entity
{
public:
    const int size = 5;
    int a[size];
    //报错因为size不是编译时间常量,size必须在编译时已知,所以需要如下
    static const int size = 5;
   // 或者
    static constexpr int size = 5;
    int a[size];//正确了
};

#include <array>

array<int, 5> another;
cout << another.size(); //是5,有额外的开销,但是值得,更安全
回复

使用道具 举报

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

本版积分规则

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