C/C++ 二维数组使用

本文详细介绍了C/C++中二维数组的初始化,包括C风格的自动分配和手动分配,以及C++风格的new分配,并讨论了二维数组作为函数参数的四种常见方式,包括数组、双指针、数组指针和单指针形式,强调了参数类型匹配和内存管理的重要性。
摘要由CSDN通过智能技术生成

1: 二维数组的初始化

(1) C风格,数组的自动分配方式。这种方式内存在栈上申请,不用手动销毁内存。注意:数组维度不能太大,否则会爆栈溢出;同时数组元素访问\赋值注意数组越界问题。

const int row = 2;

const int col = 3;

int arr[row][col]; // 编译器识别的类型是 int(*)[3]

(2) C风格,malloc手动分配方式。这种方式内存在堆上申请,用完需要free手动销毁内存。如果不销毁,会造成内存泄漏。

const int row = 2;

const int col = 3;

int** array = (int**)malloc(sizeof(int*) * row);

for (int i = 0; i < row; i++) {

        array[i] = (int*)malloc(sizeof(int) * col);

}

释放:

for (int i = 0; i < row; i++) {

        free(array[i]);

}

free(array);

(3) C++风格, new手动分配。同样也是在堆上申请内存空间,需要用delete []来手动释放。

const int row = 2;

const int col = 3;

int** array = new int* [row];

for (int i = 0; i < row; i++) {

        array[i] = new int [col];

}

释放

for (int i = 0; i < row; i++) {

        delete [] array[i]

}

deletet [] array;

2: 二维数组作为参数 (原则上形参和实参类型要保持一致)

(1) 形参为数组

这种场景形参为 int array[][col], 这种参数要指定第二维列的长度。同时要入参中指定行、列。

由于二维数组在内存中是行存储的,需要给定一个列值,编译器才能去寻址,内部寻址是array+i*col+j;   常用使用p[i][j]访问元素。要求实参定义是自动的数组分配方式。

void func(int array[][5], int row, int col)

{

        for(int i = 0; i < row; i++) {

                for (int j = 0; j < col; j++)

                        cout << p[i][j]<<endl;

        }

}

(2) 形参为双指针

这种场景形参为 int** array。要求实参定义是手动分配方式。

void func(int** array, int row, int col)

{

        for(int i = 0; i < row; i++) {

                for (int j = 0; j < col; j++)

                        cout << p[i][j]<<endl;

        }

}

(3) 形参是数组+指针形式

这种场景形参为int (*array)[col]。 要求实参定义是自动的数组分配方式。

这个是int array[][col]的变种类型。

void func(int (*array)[5], int row, int col)

{

        for(int i = 0; i < row; i++) {

                for (int j = 0; j < col; j++)

                        cout << p[i][j]<<endl;

        }

}

(4) 形参是单指针 (少用)

实参也是单指针类型, eg: int* array = new int[row * col];  用一维指针当二维数组用。

void func(int *array, int row, int col)

{

        for(int i = 0; i < row; i++) {

                for (int j = 0; j < col; j++)

                        cout << *(array + i * col + j) <<endl;

        }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值