二级指针,二维数组做形参

本文探讨了二级指针的概念及其在C++中处理二维数组的应用。通过具体实例,展示了如何使用二级指针进行数组操作,包括内存分配、数据处理及释放等关键步骤。文章深入解析了二级指针在函数参数传递中的作用,以及如何利用它实现数组元素的累加运算。

二级指针,二维数组做形参

// pointpoint.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"

#define ROW 3
#define COL 4

int **sum0(int **arr, int row, int col, int *retSize, int **retColSize)
{
    int **ret = (int **)malloc(row * sizeof(int *));
    //*retColSize = (int *)malloc(row * sizeof(int));
	int *colSize = (int *)malloc(row * sizeof(int));
    *retSize = row;
    for (int i = 0; i < row; i++) {
		colSize[i] = col;
        ret[i] = (int *)malloc(colSize[i] * sizeof(int));
        int sum = 0;
        for (int j = 0; j < col; j++) {
            sum += *((int *)arr + i * col + j);
            ret[i][j] = sum;
        }
    }
	*retColSize = colSize;
    return ret;
}

void testcase0(void)
{
	int arr[ROW][COL];
    int cnt = 0;
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            cnt++;
            arr[i][j] = cnt;
        }
    }
    
    int retSize;
    int *retColSize;
	//arr实际是int (*)[4]
    int **sum = sum0((int **)arr, ROW, COL, &retSize, &retColSize);
    for (int i = 0; i < retSize; i++) {
        for (int j = 0; j < retColSize[i]; j++) {
            printf("%d, ", sum[i][j]);
        }
        printf("\n");
    }
}

int **sum1(int (*arr)[COL], int row, int *retSize, int **retColSize)
{
    int **ret = (int **)malloc(row * sizeof(int *));
    //*retColSize = (int *)malloc(row * sizeof(int));
	int *colSize = (int *)malloc(row * sizeof(int));
    *retSize = row;
    for (int i = 0; i < row; i++) {
		colSize[i] = COL;
        ret[i] = (int *)malloc(colSize[i] * sizeof(int));
        int sum = 0;
        for (int j = 0; j < COL; j++) {
            sum += arr[i][j];
            ret[i][j] = sum;
        }
    }
	*retColSize = colSize;
    return ret;
}

void testcase1(void)
{
	int arr[ROW][COL];
    int cnt = 0;
    for (int i = 0; i < ROW; i++) {
        for (int j = 0; j < COL; j++) {
            cnt++;
            arr[i][j] = cnt;
        }
    }
    
    int retSize;
    int *retColSize;
	//arr实际是int (*)[4]
    int **sum = sum1(arr, ROW, &retSize, &retColSize);
    for (int i = 0; i < retSize; i++) {
        for (int j = 0; j < retColSize[i]; j++) {
            printf("%d, ", sum[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    testcase0();
    testcase1();
    return 0;
}

 

### C++ 中二级指针二维数组的关系及用法 #### 定义与基本概念 在 C++ 中,二级指针是指向指针指针,而二维数组是一种数据结构,用于存储具有两维索引的数据。尽管它们的功能不同,但在某些情况下可以通过二级指针来操作二维数组。 - **二级指针** 是一种特殊类型的指针,它指向另一个指针变量。其语法形式为 `type**`。 - **二维数组** 可以被看作是一个由一维数组构成的一维数组集合[^3]。 #### 使用方法 ##### 1. 通过二级指针访问二维数组 当使用二级指针访问二维数组时,通常需要先将每一行的首地址赋给一级指针,再让二级指针指向这些一级指针。以下是具体实现: ```cpp #include <iostream> using namespace std; int main() { int array[3][5] = { {0, 1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13, 14} }; // 创建一级指针数组并初始化 int* ptrArray[3]; for (int i = 0; i < 3; ++i) { ptrArray[i] = array[i]; } // 让二级指针指向该一级指针数组 int** doublePtr = ptrArray; // 输出二维数组中的元素 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 5; ++j) { cout << *(doublePtr[i] + j) << " "; // 或者写成 doublePtr[i][j] } cout << endl; } return 0; } ``` 此代码片段展示了如何利用二级指针二维数组进行间接寻址[^3]。 ##### 2. 函数参数传递的区别 如果要将二维数组作为函数参数,则需要注意传入的是整个数组还是仅部分信息。由于数组名本质上代表第一个元素的地址,在实际应用中可能会遇到一些复杂情况。例如,直接把二维数组当作形参可能引发错误,因为编译器无法自动推导出完整的维度信息[^2]。 正确的法之一是显式指定列数或者采用动态分配内存的方式创建模拟二维数组,并借助二级指针完成交互过程。 ```cpp void func(int** matrix, int rows, int cols){ for(int r=0;r<rows;++r){ for(int c=0;c<cols;++c){ cout<<matrix[r][c]<<" "; } cout<<"\n"; } } // 调用前需手动构建相应的矩阵结构体... ``` 这里强调了基于二级指针设计接口的优势——灵活性更高且更贴近实际情况下的需求场景[^2]。 #### 主要差异对比 | 特性 | 二级指针 | 二维数组 | |---------------------|---------------------------------------|-----------------------------------| | 存储布局 | 动态分配 | 静态连续区域 | | 初始化难度 | 较高 | 自动完成 | | 修改便利程度 | 方便调整大小 | 不易改变尺寸 | 综上所述,虽然两者都能用来处理类似的逻辑问题,但由于底层机制的不同决定了各自适用范围有所侧重[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值