- 1. 代码案例分析
- 1.1代码运行结果
- 2. 案例总结
就关于这个问题的答案,我和我的指导老师发生了一场激烈的辩论,最终也没能让我老师同意我的观点,既然这样就交给广大的网友们吧。我认为:char *是字符指针,老师认为:char *是字符串指针,下面给出我的观点图。
声明:此次代码的运行环境为:Linux 64位系统,g++编译器
1. 代码案例分析#include1.1代码运行结果 2. 案例总结#include #include using namespace std; //------------------------------------------[c语言的指针方式] void fun1(char *p) { p++; //p可以进行++操作,地址偏移步长为一个char类型所占字节,说明p不是一个数组地址 cout <<"fun1: "<< p < //(*p)++; 该语句报错,报错原因为不能增加p的值,说明*p相当于引用了main函数中的数组 cout <<"fun2: " << *p << endl; //输出结果为:hello cout << endl; } //------------------------------------------[c++的引用方式] void fun3(char &p) //引用字符 { cout << "fun3: " << &p << endl; //输出结果为:hello cout << "fun3: " << p << endl; //输出结果为:h cout << endl; } void fun4(char (&p)[10]) //引用数组,注意10是不能改变为其他数值的,因为arr有10个成员,为其他值时会报错类型不匹配 { //p++; 该语句报错,因为p被视为数组,对数组名进行++是不允许的 cout <<"fun4: "<< p << endl; //打印hello } int main(void) { char arr[10] = "hello"; // arr++;此代码是会报错的,因为数组名是指针常量,++操作改变了arr的值,因此报错 fun1(arr); //形参为char *p,实参被视为char *类型 fun1(&arr[0]); //形参为char *p,实参被视为char *类型 fun2(&arr); //形参char (*p)[10],实参被视为char (*)[10]类型 fun3(*arr); //形参为char &p,实参被视为char类型 fun3(arr[0]); //形参为char &p,实参被视为char类型 fun4(arr); //形参为char (&p)[10],实参被视为char ()[10]类型 return 0; }
- 分析完上述代码大家可以看到,主要的核心就是数组的类型应该是char *还是char ()[],我得出的结论是:char ()[]类型。
- 另外,有一点需要额外注意,当在main函数中调用fun函数并以arr作为实参时,arr既可以被看做char ()[10]类型也能被看做char *类型,为什么会出现这一现象? 我个人的观点是: 其根本原因是c++中引用类型的出现所导致的。在C语言中,arr被看做了字符数组首元素的地址,并且在c++里沿用了c这一特点,除此以外,在涉及到变量引用时,会不可避免地产生一些交集,那么arr到底是什么类型呢,在c++中的答案是不唯一的,arr类型的判别取决于被调用函数fun的相应形参类型了。
- c语言中依靠向函数传入指针来达到影响main函数中变量值的目的,而c++是依靠变量引用来达到该目的。
- 因为与引用类型匹配的是变量类型,而与指针类型匹配的是变量地址,但好在我们用c++开发时,不用考虑指针当做函数实参,用引用就完事了。



