精华内容
下载资源
问答
  • 作为取地址运算符时,假设 char ch = 'a'; 那么&ch是一个右值,而不是一个合法的左值。因为该表达式并未标识任何机器内存的特定位置,对&ch进行求值时,其结果没有地方存储,所以&ch不是一个合法的...

    当操作符&作为取地址运算符时,假设

    char ch = 'a';
    

    那么&ch是一个右值,而不是一个合法的左值。因为该表达式并未标识任何机器内存的特定位置,对&ch进行求值时,其结果没有地方存储,所以&ch不是一个合法的左值。

    在c++中,将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。引用和它的初始值对象绑定在一起,引用是其绑定对象的别名。

    int i = 1024;
    int &refVal = i;
    refVal = 2;     // 把2赋给了refVal指向的对象,此处既是赋给了i
    int ii = refVal // ii = i 等同

     

    展开全文
  • 关于引用取地址&运算符的用法

    千次阅读 2018-08-16 14:18:15
    这个符号的意思就是取地址和对位进行与运算 , 但在C++中 , & 被重载多了一种意思 , 就是引用。   在这里我就不介绍位与运算了 , 我先介绍一下取地址运算 ,在学习指针的时候我们就已经用过了取地址...

           在习惯了C语言的程序员眼里 , & 这个符号的意思就是取地址和对位进行与运算 , 但在C++中 , & 被重载多了一种意思 , 就是引用。 

           在这里我就不介绍位与运算了 , 我先介绍一下取地址运算  ,在学习指针的时候我们就已经用过了取地址符了 , 使用方法为在变量前面加上&即可。

    int i = 0 , *pi = &i;    //指针pi获得了i的地址
    int ** p_pi = π       //指针p_pi获得了pi的地址
    cout << &i << endl 
    << &pi << endl << &p_pi;    //可以输出地址

            接下来是介绍引用 , 简单来说 , 引用就是被引变量的另一个名字 , 当改变引用值时 , 被引值也会改变 , 因为它们两就是同一个值 , 另外 , 引用不能脱离对象单独存在 , 引用是依附与对象存在的 , 因为引用在定义后可能被使用 , 所以引用不能是无对象的 , 所以引用在定义时必须初始化。

    int i = 0 , &ri = i; //定义并初始化一个引用
    ri++; //使i的值变为1
    //int &ri2; 这里是非法的 , 因为定义了引用ri2却没有初始化它 , 在这行代码和下一行之间可能使用无对象的引用
    //ri2 = i;
    //int &ri3 = 10;
    //错误 , 引用必须有对象 , 常量没有对象

           因为引用是变量的别名 , 所以不能将某一种类型的引用绑定到另一种类型的对象上 , 比如不能将char & 赋予int型的变量。但同类型间的引用可以切换绑定 。

    int i = 0 , j = 0;
    //char &rc = i; 非法 , 因为不能用不同类型去引用
    int & ri = i; //合法 , ri是i的引用
    ri = j; //合法 , ri是j的引用

           接下来讲一下怎么区别引用和取地址 , 可以这样说 , 引用中的&只会出现在定义中 , 在变量类型(类)名后面(与指针相似) , 并且在接下来的代码中 , &符号都不会再出现 , 只需直接使用引用定义的名字即可 , 而取地址符是不用绑定类名的 , 直接在变量(对象)左边写上& 即可(变量可以是指针或引用 , 毕竟它们也算是变量)。

    int i = 0;
    int &ri = i , *pi = &i; //前一个&是引用 , 与类型名绑定在一起 , 后一个是取地址
    cout << ri << endl; //输出i的值
    cout << &i << endl; //输出i的地址
    cout << &ri << endl; //输出ri的地址
    cout << &pi << endl; //输出pi的地址

          为什么要有引用 , 在C++这样一种重视效率的语言里 , 必然需要这样一种类型 , 但我们调用一个函数时 , 就必须把参数全部复制一次 , 这样既浪费时间又浪费空间 , 但当我们把函数列表中的形参改为该类型的引用时 , 编译器就不会把整个对象复制进去 , 而只是把对象的地址传过去 , 这样在函数里使用的就是实参本身了 , 也能够修改它的值。

    void reference_test(int &i){ //传入的是引用,不是地址!
        cout << i <<endl;
        i = 0;
        cout << i << endl; //离开函数后被传入的i的值为0
    }

            注意在调用函数的时候直接使用对象名即可 , 不要再加一个& , 那样会变成传地址(参照上文)。

    int i = 5;
    reference_test(i); //正确 ,i的值变为0
    //reference_test(10); 错误 , 10是常量
    //reference_test(&i); 错误 , &i是i的地址 , 不是int型

            现在讲一下为什么不能把常量赋给引用 , 这里需要引入左值和右值的概念, 从字面并不能准确的理解左值右值 , 从对象的用途来讲 , 右值用的是对象中的内容而不在乎对象存储的位置(内存中) , 而左值既要内容也必须需要存储位置 , 从语句上讲 , 左值能够位于赋值表达式左边被赋值 , 右值则不然 , 从存在时间来讲 , 左值在作用域内会一直存在 , 右值在使用后就会马上被销毁。 综上来看  ,左值在使用场合上多于右值 , 也能代替右值 , 但右值却不能代替左值 。 定义的内置类型变量 , 对象 , 指针 , 引用等都是左值 , 而常数 , 字符串常量 , 变量间运算后的值(如 i + 5  , 而不是 i = i + 5) , 函数返回的非引用值等都是右值。 这就是为什么 int &ri = 5 是非法的了。因为引用必须绑定到左值。右值引用(&&)暂不讨论。

    int i = 0 , &ri = i , *pi = &i;   //均为左值
    //下列均错误 , 均为右值
    //ri = 10;
    //ri = i + 5;
    //ri = return_int();    return_int返回一个int值
    

        这里也只是对引用的基本认识和用法做一个了解 , 后面我会慢慢更新。

    展开全文
  • 取地址运算符,它返回运算对象的内存地址。 * :指针运算符,也称为“间接引用操作符”,它返回指针指的变量的值。 1.取地址运算符 & & 是一元运算符,返回操作数的内存地址。如果操作

    C语言的指针

    指针就是地址,指针也是C语言的一种数据类型。

    用指针类型定义的变量称作指针变量,指针变量储存的不是普通数据而是一个地址,一个变量的地址称为该变量的指针。

    指针变量定义的一般形式为:类型标识符 * 变量名

    星号是指针类型的标志。

    C语言指针变量的使用需要以下两个运算符:

    &:取地址运算符,它返回运算对象的内存地址。

    * :指针运算符,也称为“间接引用操作符”,它返回指针指的变量的值。

    1.取地址运算符 &

    & 是一元运算符,返回操作数的内存地址。如果操作数 x 的类型为 T,则表达式 &x 的类型是 T 类型指针(指向 T 的指针)。

    取址运算符的操作数必须是在内存中可寻址到的地址。换句话说,该运算符只能用于函数或对象(例如左值),而不可以用于位字段,以及那些还未被存储类修饰符 register 声明的内容。

    当需要初始化指针,以指向某些对象或函数时,需要获得这些对象或函数的地址:

    float x, *ptr; ptr = &x;          // 合法:使得指针ptr指向x ptr = &(x+1);      // 错误: (x+1) 不是一个左值

    2.指针运算符*

    相反地,当已具有一个指针,并且希望获取它所引用的对象时,使用间接运算符 *(indirection operator),有时候这会被称为解引用运算符(dereferencing operator)。它的操作数必须是指针类型。如果 ptr 是指针,那么 *ptr 就是 ptr 所指向的对象或函数。如果 ptr 是一个对象指针,那么 *ptr 就是一个左值,可以把它(即 *ptr)当作赋值运算符左边的操作数:

    float x,*ptr=&x; *ptr=1.7;// 将1.7赋值给变量x ++(*ptr);// 并将变量x的值加1

    在这个示例最后的语句中,ptr 的值保持不变,但 x 的值变成 2.7。

    如果指针操作数的值不是某个对象或函数的地址,则间接运算符*的操作结果无法确定。

    像其他一元操作数一样,运算符 & 和 * 具有很高的优先级。操作数的组合方式是从右到左。因此,表达式 ++(*ptr)中的括号是没有必要的。

    运算符 & 和 * 是互补的:如果 x 是一个表达式,用于指定一个对象或一个函数,那么表达式 *&x 就等于 x。相反地,在形如 &*ptr 的表达式中,这些运算符会互相抵消,表达式的类型与值等效于 ptr。然而,不管 ptr 是不是左值,&*ptr 都一定不会是左值。

    运算符*在C语言中,有两种作用:

    1 用作乘法,为双目运算符,形式为a*b, 就是计算数学中的a乘以b。

    2 用作取值运算,为单目运算符,根据后续操作数(必须为指针)类型,取其指向的值。

    如果你正在学习编程遇到瓶颈,感到迷茫,困惑,值得加入我的【C语言C++学习企鹅圈子
    学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!

    注意:指针运算符和指针说明符

    外形上一样,都是 * 号,但一个用在语句里,一个用在声明里。

    例如:

    int *p; 声明 p 是指针,它可用来指向一个 整形变量。

    int (*pf)(); 声明pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。

    int *ap(int x,int y){...} 声明 函数 ap, 有2个形参,函数调用会返回 一个指针,用来指向一个 整形变量。

    指针运算符,也在其操作数的左边,该操作数是一地址,用*可取得该地址处存储的变量的值,可做右值,也可做左值。

    例如:

    int myAge; int *p; //指针说明符

    *(&myAge)=24; // 指针运算符,&myAge 是地址,* 是取那个地址里的值的运算,做左值

    printf("%d",myAge); p=&myAge;

    printf(" %d",*p+1); //指针运算符, 输出 指针指向的变量的值加1,做右值。

    输出 24 25

    今天就分享到这里啦,希望对大家学习有所帮助!

    展开全文
  • #include&lt;iostream&gt; using namespace std; int main() { int i = 42; cout&lt;&lt; "i :\t" &...紧随类型名出现,因此是声明的一部分,r是一个引用 ...
    #include<iostream>
    using namespace std;  
    int main()  
    {  
        int i = 42;  
        cout<< "i :\t" << i <<endl;  
      
        int &r = i;  
        // &紧随类型名出现,因此是声明的一部分,r是一个引用  
        cout<< "r :\t" << r <<endl;  
      
        int *p;  
        // *紧随类型名出现,因此是声明的一部分,p是一个指针  
      
        p = &i;  
        // &出现在表达式中,是一个取地址符  
        cout<< "*p :\t" << *p <<endl;  
      
        *p = i;  
        // *出现在表达式中,是一个解引用符  
        cout<< "*p :\t" << *p <<endl;  
      
        int &r2 = *p;  
        // &是声明的一部分,*是一个解引用符  
        cout<< "r2 :\t" << r2 <<endl;  
      
        return 0;  
    }  

    引用
    对象的别名。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。

    C++11中新增了:右值引用(rvalue reference),这种引用主要用于内置类。严格来说,
    平时提及的“引用”,指的是“左值引用”(lvalue reference)。


    &运算符:取地址运算符


    *运算符:解引用运算符。解引用一个指针将返回该指针所指的对象,为解引用的结果赋值

    也就是为指针所指的对象赋值。

    展开全文
  • 一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用. ...在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分...
  • 取值运算符和取地址运算符 (1) 如果需要获取某个变量的地址,可以使用取地址运算符&。 char *pa = &a; int *pb = &b; (2) 如果需要访问指针变量指向的数据,可以使用取值运算符* printf("%c,%d\n...
  • 这个地址是指内存地址,这个地址取到之后,可以赋给一个指针。C语言中没有某个变量,没有某个变量,没有某个变量,在写stm32代码的时候,这样使用时错误的。 例如下面这样 int a=5; int *p=&a; 这就...
  • 关于取地址运算符&以及指针的问题

    千次阅读 2016-04-24 23:22:31
    如果在你所看的那本书里,出现了“取地址操作符即&,不能施加于表达式”这种说法的话,那么,这种说法是错误的。不过,考虑到这本书的特殊的背景,这种“错误”在某种程度上是可以被原谅的 —— 毕竟,如果那本书...
  • 取地址符和解引用符的区别Here, we are discussing about the two most useful operators with the pointers, why and how they are used? 在这里,我们用指针讨论两个最有用的运算符 ,为什么以及如何使用它们? ...
  •  解引用取地址运算符引用取地址运算符一句话的基本描述:假设有一个n级指针p,那么*p代表(n-1)级指针(n&gt;0),&amp;p代表(n+1)级指针(n&gt;=0)。 几个知识点: 它们是可以被重载的,这...
  • 5.取地址操作符重载 6.拷贝构造函数 这次将着重讲解后三个函数。 赋值运算符重载 运算符重载 ~什么是运算符重载呢? ~在构造函数中,曾提到过,C++将类型分为自定义类型内置类型。而对于已经存在的运算符(==、+...
  • 指针和引用的区别 对于指针来说,它是一个地址,这个地址是一个数值,那么就意味这个数值可以为0(空指针),也可以为其他,即指针可以不指向任何东西。 而对于引用来说,他是一个外号,外号一定是“某个存在物体”...
  • 类的默认成员函数 ...3、取地址运算符重载,包含取地址运算符重载const取地址运算符重载。 1、构造函数 1.1、构造函数概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调...
  • C++引用和运算符重载

    2020-11-28 17:31:22
    目录创建引用变量将函数作为引用参数将引用用于结构引用应用于类对象引用应用于运算符重载何时使用引用参数为什么引入运算符重载?重载运算符的定义使用重载限制 创建引用变量 C++C都用&符号来表示变量的...
  • C++ 运算符重载

    万次阅读 多人点赞 2018-12-26 21:39:21
    1. C++运算符重载的概念原理 2. C++重载=(C++重载赋值运算符) 3. C++深拷贝浅拷贝(C++深复制浅复制) 4. C++运算符重载为友元函数 5. C++实现可变长度的动态数组 6. C++重载&lt;&lt;&gt;...
  • //取地址 //地址符+变量名 &a; printf("%p\n",&a); //地址的范围0x000000000001-0xffffffffffff 由12个16进制的数组成 //地址由四个字节组成显示的是首字节的地址 //每次打印地址都是变化的,是因为地址用过...
  • 4.赋值运算符重载 运算符重载原因是:自己给的运算符不支持运算符的操作 运算符重载:目的是为了增强代码的可读性,运算符重载是具有具体特殊函数名的函数,也是具有其返回值类型,函数名字以及参数列表,其返回值...
  • 引用 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。...&作为取地址用的时候,要跟指针联系在一起,因为指针就是用来存放地址的。 取地址就是你想某变量(形参或者实
  • 【C++ Lab】 对于解引用符*以及与运算符[]优先级的探索【结论】【验证过程】阶段一 探究初步阶段二 理解解引用符——*阶段三 步入正题——[]与*优先级探索 我想很多人都看过运算符优先级表,但有时候对于一些情况...
  • 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分。其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的是址。下面我们通过实例具体了解一下 1)
  • 三目运算符可以返回引用类型,当返回的候选表达式中有一个是右值时,则返回非引用类型。 #include <iostream> #include <cstring> using namespace std; int main() { int a = 3; int b = 2; // 1...
  • C++ 提供了两种指针运算符,一种是取地址运算符 &,一种是间接寻址运算符 *。 指针是一个包含了另一个变量地址的变量,您可以把一个包含了另一个变量地址的变量说成是"指向"另一个变量。变量可以是任意的数据...
  • 取地址和取值操作符

    千次阅读 2020-05-01 18:50:59
    取地址和取值操作符 取地址操作符是&,也叫引用。 i_pointer=&i; 通过该操作符我们可以获取一个变量的地址值。 取值操作符为*,也叫解引用。 通过该操作符我们可以拿到一个地址对应位置的数据。 int* i_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,898
精华内容 37,159
关键字:

取地址运算符和引用