c语言 &取地址运算符的理解

对于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 的值做为地址)的那个空间的值。

相关文章
相关标签/搜索