int **指针问题

在打印二维数组时遇到了问题,二维数组可以这样定义int matrix[ROWS][COLUMNS],但是打印二维数组时函数的声明是void printMatrix(int ** numbers,int rows,int columns)。那么将matrix作为参数传递给printMatrix时会出现问题,因为matrix是 int (*)[COLUMNS]类型的,但是函数printMatrix需要的是int **类型的,这两者明显不匹配。

int **从类型上讲是一个指向整型指针的指针,那么如果想要用它来表示一个矩阵需要怎么做呢?因为它的元素是一个指针,如果如果它的每一个元素都表示矩阵的一行,那么它就可以用来表示一个矩阵了。实现代码如下:

//生成矩阵
int ** generateMatrix(int rows,int columns)
{
	int **numbers=new int*[rows];
	for(int i=0;i<rows;i++){
		numbers[i]=new int[columns];
		for(int j=0;j<columns;j++)
				numbers[i][j]=i*columns+j;
	}
	return numbers;	
}

int **numbers=new int*[rows];这行代码开始怎么都看不明白,后来突然发现把int*当做一个整体看就明白了。它表示创建了一个大小为rows的数组,这个数组的每一个元素代表一个指针。内存布局如下:


这里numbers是一个指向指针的指针,能够用numbers用来表示矩阵的关键就在于使用new关键字分配的内存是连续的,这样number[i]的地址就可以根据numbers的地址计算出来,因为指针变量占据4个字节的内存区域(32位机器)。

如果不使用上面的方式分配内存,numbers就真的只是一个指向指针的指针了

下面列出几种numbers初始化错误的处理方式及错误的原因:

错误1:

	int p[]={1,2,3,4};
	int **numbers=&p;
这种用法会报如下错误:error:cannot convert "int (*)[4]" to "int **" in initialization int **numbers=&p;

原因是类型不匹配,p是一个指向数组的指针,这个数组中有4个元素,但是&p是一个指向含有4个元素的数组的指针类型(int (*)[4]),借助二维数组中的行指针和列指针很好理解,与int **明显不匹配。

错误2:

如果在上面加上强制类型转换呢?

	int p[]={1,2,3,4};
	int **numbers=(int **)&p;
加上强制类型转换后代码编译正常,但是运行直接出错。

下面列出完整的测试代码:

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
//打印矩阵
void printMatrix(int ** numbers,int rows,int columns){
	for(int i=0;i<rows;i++)
	{
			for(int j=0;j<columns;j++)
					std::cout<<numbers[i][j]<<" ";
		std::cout<<std::endl;
	}
}

//生成矩阵
int ** generateMatrix(int rows,int columns)
{
	int **numbers=new int*[rows];
	for(int i=0;i<rows;i++){
		numbers[i]=new int[columns];
		for(int j=0;j<columns;j++)
				numbers[i][j]=i*columns+j;
	}
	return numbers;	
}
int main(){
	int **numbers=generateMatrix(4,5);
	printMatrix(numbers,4,5);
	//释放内存
	for(int i=0;i<4;i++)
			delete [] numbers[i];
	delete numbers;
	return 0;




  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值