对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回当时声明p 时开辟的地址;可是根据我对代码的观察,我以为&运算符不仅是返回地址的功能;指针
例如:编译器
int a = 1;
//假设a的地址是0x7dfe88
int *p = (int *)0x7dfe88;编译
int num = 1;
int *p1 = #
变量
以上是一段简单的给指针p,p1赋值的代码,0x7dfe88是一段单纯的十六进制地址,可是当地址转指针的时候却必须加上强转(int *);若是不增强转,那么编译器就会提出警告( warning C4047: “初始化”:“int *”与“int”的间接级别不一样);可是使用&运算符取地址的时候却不须要加任何强转就能编译经过,说明&运算符毫不是的获取地址那么简单,“=”赋值运算符的运算顺勋是从右向左,说明"="的右边也是一个指针,因此在此假设&运算符会取出num的地址,而且根据num的类型生成一个临时的指针。百度
根据假设,写出以下代码验证:语言
int num = 1;
double *p1 = #兼容
结果编译器报“ warning C4133: “初始化”: 从“int *”到“double *”的类型不兼容”错误。因此个人假设有必定的道理。错误
综上所述:生成
(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型。(只是本人本身观点)运算符
经过对指针&运算符的理解,我认为*运算符在某些状况下(例如二级指针)一样有将一个地址转化成指针的功能。
例子:
int num = 1;
int *p = #
int **p1 = &p;
int *p2 = *p1;
若是将int *p2 = *p1;替换成double *p2 = *p1;,那么编译器会警告: warning C4133: “初始化”: 从“int *”到“double *”的类型不兼容
因此(*p)操做是这样一种运算,获取指针p的值(变量的地址)找到对应的变量的值-----返回以(p 的值做为地址)的那个空间的值。