C++中的指针和动态分配二维数组问题

1. new int[n] 和 new int(n)的区别?

int *p_data = new int(n)   // 表示  指针p_data指向一个int型的数据(对象),这个数据初始化为n

int *p_data = new int[n]   //  表示 分配一个长度为n的int型的数组,p_data指向这个数组

int *p_data = (int *)malloc(sizeof(int ) * n)    //  等价于第二条语句


2.  动态分配二维数组方法——之一

首先,动态分配内存来定义一个指针数组(二级指针),然后为这个数组的每一个成员(指针)动态分配内存,让每一个成员指向一个一位数组,这样就等价于定义了一个二维数组。

测试代码如下:

#include<iostream>
#include<stdio.h>
using namespace std;

int main(){
	int row = 10, col = 15;   // 数组的行、列
	int **p_data = new int*[row];  //动态分配一个指针数组(二级指针)

	for(int i = 0; i < row; i++){   //将数组的每一个成员(指针)  指向一个一维数组
		p_data[i] = new int[col];   
	}

	for(int i = 0; i < row; i++){     // 给这个二维数组赋值
		for(int j = 0; j < col; j++){
			p_data[i][j] = i*j;
		}
	}
	
	for(int i = 0; i < row; i++){    // 打印出二维数组的每个成员
		for(int j = 0; j < col; j++){
			printf("%3d", p_data[i][j]);
		}
		printf("\n");
	}
		
	for(int i = 0; i < row; i++){   // 释放指针数组中的每一个成员(指针)
		delete[] p_data[i];
		p_data[i] = NULL;
	}
	delete[] p_data;   // 最后释放这个指针数组
	p_data = NULL;

	return 0;
}

测试结果如下:



3.  动态分配二维数组方法——之二

这个方法的局限在于:数组的列要设置为const类型或者宏定义为常量

原理:首先动态分配一个一维数组,大小为目的二维数组的总大小,然后将这个一维数组强制转换成二维数组指针,这样就等于创建了一个二维数组。

测试代码如下:

#include <stdio.h>  
int main()  
{  
    const int COL = 8;  
    int row  = 5;
  
    //申请一维数据并将其转成二维数组指针  
    int *p_data = new int[COL * row];
    int (*pp_data)[COL] = (int(*)[COL])p_data;

    for(int i = 0; i < row; i++){     // 给这个二维数组赋值  
        for(int j = 0; j < COL; j++){  
            pp_data[i][j] = i*j;  
        }  
    }  
      
    for(int i = 0; i < row; i++){    // 打印出二维数组的每个成员  
        for(int j = 0; j < COL; j++){  
            printf("%3d", pp_data[i][j]);  
        }  
        printf("\n");
    }  
  
    delete[] p_data;
    return 0;  
}  

测试结果如下:



4.  指针数组与数组指针的区别

数组指针:如 int(*p)[n] 表示 p 是一个指针,指向了一个二维数组。

指针数组:如int *p[n]  表示  p 是一个数组,里面存放的是n个指针变量。

















  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值