2011华为编程大赛第一道题 指针常量与常量指针

先上题目和代码

// MatrixTranspose.cpp : 定义控制台应用程序的入口点。
//
/*
2011华为编程大赛(a卷)
1、矩阵转置(20分)
	问题描述
	将一个N*N矩阵的行列互换
	要求实现函数 
	void MatrixTranspose (const char *InArr, unsigned int n, const char *OutArray)
	【输入】InArr:		输入的字符矩阵
	n:			N*N矩阵的行数
	【输出】OutArray:	转置后的字符矩阵
	【返回】 无
	注:输入输出的矩阵都是以一维形式保存的二维数组,
	比如输入为{‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’},
	实际上表示如下3*3的矩阵
	‘1’,’2’,’3’,
	‘4’,’5’,’6’,
	‘7’,’8’,’9’
	示例
	输入InArr = {‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’},n=3
	输出OutArray = {‘1’,’4’,’7’,’2’,’5’,’8’,’3’,’6’,’9’}
*/

#include "stdafx.h"
#include "iostream"

using namespace std;

void MatrixTranspose (const char *InArr, unsigned int n, const char *OutArray)
{
	int outAddr = (int)OutArray;
	char *out = (char *)outAddr;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			out[j * n + i] = InArr[i * n + j];
		}
	}
	out[n * n] = '\0';
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	int n = 3;
	char InArr[9] = {'1','2','3','4','5','6','7','8','9'};
	char OutArray[10];
	memset(OutArray, ' ', 9);
	MatrixTranspose(InArr, 3, OutArray);
	for (int i = 0; i < 9; i++)
	{
		cout << OutArray[i] << " ";
	}
	
	system("pause");
	return 0;
}


刚看题目觉得很轻松,但是真写起来时候遇到了坑,请注意输出是:const char *OutArray写到那里发现const是无法赋值改变的。


这牵涉到两个概念了。

指针常量与常量指针

指针常量:指针本身是个常量,意思是一个被声明为“char* const chrPtr”形式的指针,你不能把它修改为指向内存中的另一处地址,但可以用它来改变它所指向的地址处的数据内容。

常量指针:指向常量指针,是一个被声明为“const char* chrPtr”形式的指针,你可以把它修改为指向内存中的另一处地址,但不能用来修改它所指向的地址处的数据内容。


显然此处输出是一个常量指针,你不可以直接通过OutArray的地址来改变其内容的值。虽然其指向的地址可以改变,但是跟这个题目需求就无关了。

代码中采用了曲线救国的方法啊

	int outAddr = (int)OutArray;
	char *out = (char *)outAddr;


如此回避常量指针,只要记录下其地址,用其它指针(out)对地址内的内容进行修改即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值