一:*的修饰对象
如下代码
int errNumb = 0;
(int*) p2 = &errNumb; //编译错误
再修改为如下:
int errNumb = 0;
int (*p2) = &errNumb; // 编译通过
上述代码是在vs2022的环境下编译的;
说明*是用来修饰变量的,说明不存在(int*)这种类型;
二:const的修饰对象
于是我们以此来理解
int errNumb = 0;
//int const (*curErr1) = &errNumb; // 能编译通过
const int (*curErr1) = &errNumb; // 能编译通过
curErr1 = nullptr;
说明const在int前和后是一样的,指针本身的值(地址)是可以被改变的,但是如下是编译错误的
int errNumb = 0;
//int const (*curErr1) = &errNumb;
const int (*curErr1) = &errNumb;
(*curErr1) = 5; // 编译错误
说明指针指向的内容是不可以改变的;
所以const在const int (*curErr1) = &errNumb中,是用来修饰指针所指向的东西即 (*curErr1),所以也和*所指的提领运算符对应起来了;
如下:
int errNumb = 0;
//int const (* const curErr1) = &errNumb; // 编译错误
const int (* const curErr1) = &errNumb; // 编译错误
curErr1 = nullptr;
(* const curErr1)说明这里的const 已经是用来修饰curErr1这个指针变量本身了;注意const位于*和curErr1之间;所以curErr1指针本身的值不能被改变
三:typedef指针
//typedef char (*pstring); // 编译通过
typedef (char *) pstring; // 编译错误,再次证明了*是用来修复变量的
但是却有如下的用法
pstring pps1, pps2; 换种写法就是 char *pps1, *pps2;
说明typedef 定义了(*pstring)作为char类型的别名;而pstring就成了(char *)这种类型的别名,这跟上述第一节讲的没有(int *)这种类型好像是有冲突;但仔细想象,(char *)是我们自己用typedef定义出来的,注意,是我们自己定义出来,所以它(char *)这种类型就存在了;
2万+



被折叠的 条评论
为什么被折叠?



