定义一个指向数组的指针的方式为:
#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是一个指针也没什么错,有别的看法,或者这样说不对的话,可以留言。
各位可以验证一下!