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个指针变量。