关于定义一个指向整个一维数组的指针与其错误的赋值方法

定义一个指向数组的指针的方式为:

#include<iostream>
#include<Windows.h>

using namespace std;
/*
练习 1 
 实现含有中文字符的字符串逆转,如: “我是小萌新” 转换成“新萌小是我” 
*/

#define N 5

int main(void) {
	char a[N][4] = {{"我"}, {"是"}, {"小"}, {"萌"}, {"新"}};
	char (*p)[4];//定义一个指向有四个成员的数组的指针
	p = &a[4];//正确赋值方法

	for(; p>=&a[0]; p--) {//倒着输出为:新萌小是我
		cout << (*p);
	}


	cout << endl;



	system("pause");
	return 0;
}

这样定义与赋值是正确的,然而如果这样赋值:

p = a[4]//错误赋值方法

这是错误的赋值方法。原因:
1).a[4]作为指针时,指向的是a[4][0],而不是整个数组
cout << *a[4] << endl; (相当于cout << a[4][0] << endl;).

2).若要指向整个数组,则应为&a[4],&a[4]才是a[4]整个数组的地址,可以直接输出a[4]整个数组:
cout << a[4] << endl; (相当于cout << *(&a[4]) << endl,可以这样理解,这样写也可以过编译,我用的VC++2010,不知道其他编译器能不能过,这样写有点多此一举!这不过是为了便于理解才如此)

3).变量p是一个指向有四个成员的字符类型的指针,所以要给p赋值的条件为:整个数组的地址,并且这个数组是字符类型,有四个成员。

因此,p = a[4]就是错误的赋值方法,因为变量p是一个指向整个数组的指针,而a[4]只是指向了a[4][0]的指针

#include<iostream>
#include<Windows.h>

using namespace std;
/*
练习 1 
 实现含有中文字符的字符串逆转,如: “我是小萌新” 转换成“新萌小是我” 
*/

#define N 5

int main(void) {
	char a[N][4] = {{"我"}, {"是"}, {"小"}, {"萌"}, {"sdf"}};
	char (*p)[4];//定义一个指向有四个成员的数组的指针
	p = &a[4];//正确赋值方法
	//p = a[4];
	for(; p>=&a[0]; p--) {//倒着输出为:sdf萌小是我
		cout << (*p);
	}

	
	cout << endl;
	cout << *a[4] << endl;//打印出来是s,而不是sdf


	system("pause");
	return 0;
}

为了直观地表现出来,把汉字’新’换成’sdf’,还有一个字节是字符串结束符,打印结果:
只打印了字符‘s’
注意:字符二维数组中的每一个一维数组,都必须要有一个字符串结束符

<—————————分割线——————————>
这样的话,那么,反过来,定义一个指向一个成员的普通指针p,定义一个普通的一个一维字符数组a,这样是否成立:

p = &a;

成不成,上代码试一下:

#include<iostream>
#include<Windows.h>

using namespace std;

#define N 5

int main(void) {
	char a[N] = {"sadg"};
	char *p = NULL;
	p = &a;//编译器提示错误
	
	system("pause");
	return 0;
}

编译器提示错误,(我画红线的部分):
在这里插入图片描述
编译器认为&a是char (*)[5]类型,是指向了5个字符成员的指针,p只是指向了一个字符成员的指针。
应该可以这样说吧,毕竟这样写,编译器没有报错:

cout << *(&a) << endl;

那么,我说&a是一个指针也没什么错,有别的看法,或者这样说不对的话,可以留言。
各位可以验证一下!
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值