您的位置:首页 > 编程语言 > C语言/C++

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

2016-03-11 20:52 453 查看
1. new int
和 new int(n)的区别?

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

int *p_data = new int
  //  表示 分配一个长度为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++){

4000
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)
 表示 p 是一个指针,指向了一个二维数组。

指针数组:如int *p
 表示  p 是一个数组,里面存放的是n个指针变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: