当前位置: 首页 > wzjs >正文

杭州萧山做网站推广注册app拿佣金平台

杭州萧山做网站,推广注册app拿佣金平台,网上电商,创网讯通c中,“&”符号有时代表引用,有时代表取地址符。 一、引用和取址 引用是一个已存在变量的别名,修改别名的值,原始变量的值也会改变;而取地址符则是得到一个指针,该指针指向变量的内存地址。 1&#x…

c++中,“&”符号有时代表引用,有时代表取地址符。

一、引用和取址

引用是一个已存在变量的别名,修改别名的值,原始变量的值也会改变;而取地址符则是得到一个指针,该指针指向变量的内存地址。

1)引用

int a = 10;
int &ref = a;  // ref 是 a 的引用

此时 ref 和 a 指向的是同一个内存地址,修改 ref 就等于修改 a。

引用也可以作为参数传递:

void func(int &x) {x = 20;  // 修改的是外部传入的变量
}int main() {int a = 10;func(a);  // 这里传进去的是 a 的引用std::cout << a << std::endl;  // 输出 20
}

在函数中修改,函数外部的原始变量的值也相应改变。

2)取地址符

int a = 10;
int *p = &a;  // p 是指向 a 的指针

我之所以会探究这个问题,是因为我原先一直认为,&就是取址符号,而不知道有所谓引用,怀疑一个变量,如果经过多次取址,会出现问题,比如:

void funcA(int &x) {x *= 2;  // 修改的是外部传入的变量
}
void funcB(int &x){x = funcA(x);x += 10;
}int main() {int a = 10;funcB(a);  // 这里传进去的是 a 的引用std::cout << a << std::endl;  // 输出 30
}

以上代码,我就担心,在funcB中,传入了x的内存地址,然后在funcB中调用了funcA,又取一次地址,那么funcA中处理的x,其实是地址的地址?其实这都是误解。在函数中,它们都是引用,不会出现拿到的是“地址的地址”这种局面。

二、引用和取址的使用区别

在这里插入图片描述
在变量定义/函数参数中 → 是引用
在表达式中对变量使用 → 是取地址
在这里插入图片描述

三、为什么要有引用

1、便利和简洁

使用指针可以达到修改原始变量值的目的,但引用带来了额外的便利性和安全性。对比一下:
1)引用

void increment(int &x) {x++;
}int a = 5;
increment(a); // 直接传递 a 的引用,无需 &a

2)指针

void increment(int *x) {(*x)++;
}int a = 5;
increment(&a); // 需要传递 a 的地址

2、安全性

引用必须初始化:在声明引用时,你必须同时初始化它指向哪个变量,这意味着引用总是有效的(除非引用的是一个临时对象)。一旦一个引用被初始化为指向某个变量,它就不能再指向另一个不同的变量。

指针可以不初始化:指针可以在声明时不初始化,这可能导致悬挂指针或未定义行为的问题。

int x = 10;
int y = 20;int &ref = x; // ref 是 x 的引用
ref = y;      // 将 y 的值赋给 x,而不是重新绑定 ref 到 y// 下面的代码会导致编译错误:
// int &ref = y; // ❌ 错误!不能再次初始化一个已经存在的引用

3、避免空指针问题

引用不能为 NULL:引用总是关联到一个有效的对象,因此不会出现空引用的情况,减少了潜在的错误源。
指针可以是 NULL:如果忘记检查指针是否为 NULL 就使用它,可能会导致程序崩溃或其他不可预测的行为。

4、 简化函数重载

在某些情况下,引用可以帮助更清晰地区分函数重载版本。例如,对于接受左值和右值的不同版本的函数,引用可以用来区分这两种情况。

void foo(const std::string &s); // 接受左值
void foo(std::string &&s);      // 接受右值

所谓的左值,就是有明确内存地址的变量的值;而右值则是没有明确内存地址的值,比如运算结果,孤零零的字符串,数值等。右值可以用&&符号来代表(在这里不是 与 符号)。

int x = 10;
int &ref1 = x;
int &&ref2 = 20; // 合法:20 是一个右值,ref 是它的右值引用
int &&ref3 = x;//错!!!x 是左值,不能绑定到右值引用

另一个例子

#include <iostream>
#include <string>// 接受左值:const 左值引用
void foo(const std::string &s) {std::cout << "[左值版本] 接收到一个左值: " << s << std::endl;
}// 接受右值:右值引用
void foo(std::string &&s) {std::cout << "[右值版本] 接收到一个右值: " << s << std::endl;// 可以在这里安全地移动 s 的资源std::string movedStr = std::move(s);std::cout << "[右值版本] 资源转移后: " << movedStr << std::endl;
}int main() {std::string str = "Hello";// 调用左值版本foo(str); // 调用右值版本(临时对象)foo("World");// 调用右值版本(显式 move)foo(std::move(str));// 此时 str 已经被 move,内容不确定,但仍是有效状态if (str.empty())std::cout << "str is now empty after move" << std::endl;return 0;
}

5、其他

使用引用而不是按值传递可以避免不必要的对象拷贝。对于大型对象如 std::string,这可以显著提高性能,因为不需要复制整个字符串的内容。

void foo(const std::string &s) {// s[0] = 'A'; // ❌ 错误:不能修改 const 对象std::cout << s << std::endl; // ✅ 合法:只读访问
}
std::string str = "Hello";
foo(str); // 传递的是 str 的引用,而不是它的副本
http://www.dtcms.com/wzjs/276528.html

相关文章:

  • 网站txt地图怎么做seo推广官网
  • 售后服务规范网站建设市场推广seo职位描述
  • 微信备份wordpressseo网站整站优化
  • 网站站外优化怎么做免费外链代发平台
  • 那些做面点的网站好上海seo优化外包公司
  • 设计网站下载百度应用搜索
  • 怎么在ppt上做网站网络推广途径
  • 中山做网站哪家便宜快速排名优化
  • 河北高端建设网站自媒体账号申请
  • 武汉做网站冰洁找到冰洁工作室企业网搭建
  • swoole怎么做直播网站域名查询工具
  • 丰都网站建设费用武汉seo网站排名优化
  • 网站设计方案怎么做正规代运营公司排名
  • 做h的动漫在线观看网站百度竞价排名算法
  • 网站建设手机版seo教学免费课程霸屏
  • 在哪里可以做公司网站营销背景包括哪些内容
  • 男女做羞羞羞的网站长春seo外包
  • 做php门户网站那个系统好搜图片找原图
  • 建设工程网站什么时候可以同步seo专员是什么职位
  • 室内设计可以去哪些公司seo网络优化推广
  • 做cad模板下载网站外链网站大全
  • 提升网站建设seo公司上海牛巨微
  • 网站建设款如何入账seo教程视频论坛
  • 购物网站销售管理长沙本地推广
  • 坪山新区城市建设局网站网站关键词优化
  • 怎么制作网站教程云南网站建设公司哪家好
  • 下载网站建设百度应用下载
  • 怎样健建设一个有利于优化的网站app推广方式
  • 公司建设网站的必要性怎么在百度上做网站
  • 如何鉴别建设银行网站真伪地推团队接单平台