【C\C++动态创建二维数组的方法】

数组指针和指针数组

数组指针

数组指针(Array Pointer):

数组指针是指向数组的指针,它指向数组的首地址。数组指针的声明需要指定所指向的数组类型,而不是数组的大小。

int a1[3] = {1, 2, 3};
int (*p)[3]; // 声明一个指向包含三个整数的数组的指针
p = &a1; // 将p指向数组a的首地址

或者更直观点,便于后文理解。

int a[][3] = { {1,2,3},{4,5,6} };
int(*p)[3]=a;

指针数组

指针数组(Pointer Array):

指针数组是一个数组,其元素都是指针类型。每个元素指向不同的内存位置,这些位置可以是相同类型的数据。在声明指针数组时,需要指定数组的大小和元素类型,然后每个元素都可以被赋值为指向相应数据类型的指针。

	int a1[3] = {1,2,3};
	int a2[3] = {3,2,1};
	int a3[3] = {2,2,2};
	//指针数组
	int* b[3] = {a1,a2,a3};

C++创建二维数组

  1. 方法一 数组指针
int main() {
	
	//使用的是数组指针的方法
	int(*p)[3] = new int[3][3];
	// 给二维数组赋值
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			p[i][j] = i * 3 + j + 1;
		}
	}

	// 访问和输出二维数组的元素
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			cout << p[i][j] << " ";
		}
		cout << endl;
	}
	delete[] p;
return 1;
}
  1. 方法二 指针数组
int main(){
	int rows = 2;
	int cols = 3;
	// 动态分配一个 2x3 的二维数组
	int** p = new int*[rows];
	for (int i = 0; i < rows; i++) {
	    p[i] = new int[cols];
	}
	// 给二维数组赋值
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < 3; ++j) {
			p[i][j] = i * 3 + j + 1;
		}
	}
	
	// 访问和输出二维数组的元素
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < 3; ++j) {
			cout << p[i][j] << " ";
		}
		cout << endl;
	}
	delete[] p;
}


C语言创建二维数组

  1. 方法一 指针数组
int main() {
	
	//创建2*3的二维数组。
	int** a = (int**) malloc(sizeof(int*) * 2);
	
	for (int i = 0; i < 2; i++)
	{
		a[i] = (int*)malloc(sizeof(int) * 3);
	}
	
	// 给二维数组赋值
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < 3; ++j) {
			a[i][j] = i * 3 + j + 1;
		}
	}

	// 访问和输出二维数组的元素
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < 3; ++j) {
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	delete[] a;
return 1;
}

malloc(sizeof(int*) * 2) 是一个大小为2的指针数组,里面有两个位置{int*,int*}可以存放int指针类型的值。这里可能比较迷惑的是为什么用int** a来接收,其实a默认指向的是两个位置的第一个位置的地址,该位置 int* 其实可以理解为就是一个一维数组,那么该数组的地址就是指针的指针,所以可以使用int**的变量a来指向。a[0]、a[1]分别是第一行、第二行({int*,int*})的开始地址。a[0][1]就是第一个int*地址上下标为’1’的值。

要明白int**为什么能指向int*[2],看完以下代码可能就清晰了:

int main() {
	//创建2*3的二维数组。
	int x1[] = {1,2,3};
	int x2[] = {4,5,6};
	int* s[2] = {x1 ,x2 };
	int** a = s;
	
	cout <<a[0][0]<<"  "<<a[0][1] <<"  "<<a[0][2]<<endl;
	cout <<a[1][0]<<"  "<<a[1][1] <<"  "<<a[1][2]<<endl;

	return 1;
} 

运行输出:
运行结果

  1. 方法二 数组指针
int main(){

	//数组指针a指向2*3的二维数组
	int(*a)[3] = (int(*)[3])malloc(sizeof(int)*2*3);
	
	// 给二维数组赋值
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < 3; ++j) {
			a[i][j] = i * 3 + j + 1;
		}
	}
	
	// 访问和输出二维数组的元素
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < 3; ++j) {
			cout << a[i][j] << " ";
		}
		cout << endl;
 	delete[] a;
 	return 1;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值