zoukankan      html  css  js  c++  java
  • 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 的值作为地址)的那个空间的值。

  • 相关阅读:
    Android 7.0及以上使用OpenCL
    image_channel_data_type含义
    Valgrind.Callgrind使用
    如何在WIN10内置Ubuntu中有多个terminal
    Android: 在native中访问assets全解析
    OpenCL的buffer以及sub-buffer
    C语言程序设计(五) 选择控制结构
    C语言程序设计(三) 简单的算术运算和表达式
    C语言程序设计(二) C数据类型
    C语言程序设计(一) 为什么要学C语言
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5125149.html
Copyright © 2011-2022 走看看