https://baijiahao.baidu.com/s?id=1702573193376441989&wfr=spider&for=pc

总结:

1.函数参数传递主要分为值传递和&引用传递,两种传递都是形参对实参的拷贝;

2.直接点的用法是,如果需要改变实参 使其在函数执行外也处于被改变后的状态 那么就用&引用传递 否则直接用值传递 在跳出函数体外保持原样;

3.for循环中的&引用?值传递会复制一个值 所以引用会更快一些 ,具体区别:

https://blog.csdn.net/weixin_44788542/article/details/126260987

*和&的用法:

1:数组和指针

int main()
{
double *p;//一个指向double类型的指针。定义的时候前面有个*表示是个指针
double runoo[2] = {1, 3};//runoo是一个指向&runnoo[0]的指针,即数组runnoo的第一个元素的地址。&用来取地址。
p = runoo; //把p赋值为数组runoo的第一个元素的地址。通过*p可以给出储存在p中相应地址的值。*用来访问地址。
cout << "use p " << endl;
for (int i = 0; i < 2; i++) {
cout << "*(p+" << i <<"):";
cout << *(p + i) << endl;
}
cout << "use runoo " << endl;
for (int i = 0; i < 2; i++) {
cout << "*(runoo+" << i <<"):";
cout << *(runoo + i) << endl;
}

2:传递一个指向数组的指针

两种方法:直接形式参数是个指针;或者形式参数是数组(数组会在函数中转化成指针类型)

https://www.runoob.com/cplusplus/cpp-passing-arrays-to-functions.html

void test(double runoo[]) {//传递数组给函数时,数组类型会自动转换为指针类型,因而实际传的是地址。也可以写成double *runoo or double runoo[5]
for (int i = 0; i < 5; i++) {
cout << *(runoo + 1)<< endl; // ruuoo是一个地址,可以通过这样的方式访问到3这个元素。
cout << runoo[i]<< endl;//也可以这样从1开始逐个访问到元素
}
} int main()
{
double runoo[5] = {
1, 3, 4, 5,
6}; // runoo是一个指向&runnoo[0]的指针,即数组runnoo的第一个元素的地址。&用来取地址。
test(runoo);
return 0;
}

3.指针的三种基本操作

int main() {
int var = 20; // 实际变量的声明
int *ip; // 1.定义一个指针变量 ip = &var; // 2.把变量地址赋值给指针 cout << "Value of var variable: ";
cout << var << endl; // 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl; // 3.访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
}

4.函数调用

#include"iostream"
#include "math.h"
#include"string"
#include "vector"
using namespace std;
//值传递
void change1(int n){
cout<<"值传递--函数操作地址:"<<&n<<endl;//行参对实参进行了拷贝,所以地址变了,这里显示的是行参的地址;
n++;//值传递对形式参数的变更在函数体外对实参不生效
} //引用传递
void change2(int & n){//被调函数的形式参数作为局部变量在栈中开辟了内存空间,但是此时存放的是主调函数放进来的实参变量的地址,被调函数对行参的任何操作都被处理为间接寻址:通过栈中存放的地址访问主调函数中的实参。所以会影响主调函数的实惨变量
cout<<"引用传递--函数操作地址:"<<&n<<endl;
n++;
}
//指针传递
void change3(int *n){
cout<<"指针传递--函数操作地址:"<<n<<endl;
*n=*n+1;//用*n来取得实际指向的值来进行计算
}
int main(){
int n=10;
cout<<"实参的地址: "<<&n<<endl;
change1(n);
cout<<"after change1() n="<<n<<endl;
change2(n);
cout<<"after change2() n="<<n<<endl;
change3(&n);//传入的需要是一个地址
cout<<"after change3() n="<<n<<endl;
return 0;
}

5.指针的移动

int main(){
int test[3] = {10, 100, 1000};
int *p;//定义指针
p = test; //地址赋值给指针
for (int i = 0; i <= 2; i++) {
cout << "address of the test" << i << " ";
cout << p << endl; cout << "val of the test" << i << " ";
cout << *p << endl;
p++;
}
return 0;
}

6.指针的指针

int main(){
int var;
int *ptr;
int **pptr;//指向int指针的指针
var = 3000; // 获取 var 的地址
ptr = &var; // 使用运算符 & 获取 ptr 的地址
pptr = &ptr; // 使用 pptr 获取值
cout << "var 值为 :" << var << endl;
cout << "*ptr 值为:" << *ptr << endl;
cout << "**pptr 值为:" << **pptr << endl; cout << "val 的地址为:" << &var<< endl;
cout << "ptr 的值为:" << ptr << endl; //应该为val的地址
cout << "ptr 的地址为:" << &ptr << endl;
cout << "pptr 的值为:" << ptr << endl;//应该为ptr的地址
return 0;
}

string:

#include"iostream"
#include "math.h"
#include"string"
#include "vector"
using namespace std; int main() {
string teststr = "http.runoob.com"; //打印字符串的长度length
cout << "the length of teststr:" << teststr.length() << endl; //拼接字符串append
teststr.append(".add");
cout << "after append:" << teststr << endl; //删除
int pos = teststr.find(".add"); //寻找字符串.add的起始位置
cout << "pos:" << pos << endl;
teststr.replace(pos, 4, ""); //把从pos之后的4个置为空 即删除
cout << "delete .add:" << teststr << endl; //获取子串
cout << "substr:" << teststr.substr(1,3) << endl;
return 0;
}

指针:

std::vector::data()的用法

https://zhuanlan.zhihu.com/p/481161498

在指针前面放const :

比如const int* p

const和int可以互换位置,const表示的是*p不可变。此时*p指向的是内容,内容不可变,但是p可变,即指向的地址可以变,但是指向谁 谁就不可变。

http://c.biancheng.net/view/218.html

[自用初学]c++值传递和引用传递/ *&/ string的更多相关文章

  1. JavaScript:函数:函数传参传的是什么?值传递还是引用传递?

    我们调用函数的时候,把实参放入到括号里进行传参,让形参接收实参的数据. 在这个过程中,形参接收的数据到底是什么,换句话说,我们传参传的到底是什么东西? 初学JS的,可能不太难理解这个问题的意义是什么? ...

  2. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  3. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

  4. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  5. java的值传递和引用传递

    昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...

  6. PHP值传递和引用传递的区别

    PHP值传递和引用传递的区别.什么时候传值什么时候传引用 (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优 ...

  7. JavaScript 函数参数传递到底是值传递还是引用传递

    tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里 ...

  8. 【转载】C++ 值传递、指针传递、引用传递详解

    原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...

  9. java中方法的参数传递机制(值传递还是引用传递)

    看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参 ...

  10. java 对象传递 是 值传递 还是 引用传递?

    这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...

随机推荐

  1. 使用 FreeSSL 申请免费证书

    官网 https://freessl.cn/ 首先,注册一个账户 然后登录 输入自己的域名,选择第2个"亚洲诚信"(1年),然后点击"创建免费SSL证书"按钮 ...

  2. vue2 安装swiper

    npm install swiper@5.4.5 -D

  3. python 嵌套对象转为dict

    as_dict(self, keys=None, exclude_keys=None): """ 将ORM对象序列化为字典 :param keys: :return: & ...

  4. unable to access 'https://github.com/.../...git': Recv failure: Connection was reset

    解决git下载报错:fatal: unable to access 'https://github.com/.../...git': Recv failure: Connection was rese ...

  5. SpringBoot整合MyBatis-Plus详细使用方法

    SpringBoot整合mp 一.添加依赖pom.xml <dependency> <groupId>mysql</groupId> <artifactId& ...

  6. 图像高斯滤波的Verilog实现

    高斯滤波的原理: 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程.通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过 ...

  7. Javascript格式化数字字符串,如手机号,银行卡号的格式化

    手机号13312341234转化成133 1234 1234 //方式一 function format_tel(tel){ tel = String(tel); return tel.replace ...

  8. zookeeper(1)-集群的搭建

    集群搭建 1. 下载二进制文件 $ wget --no-check-certificate https://mirrors.ustc.edu.cn/apache/zookeeper/zookeeper ...

  9. Warning: PHP Startup: Unable to load dynamic library 'php_pdo_oci.dll'处理

    出现这样提示的原因可能有以下几种: (1)没有在php.ini中将extension=php_pdo_mysql.dll前面的分号去掉 在php.ini中分号表示注释,因为在配置时被注释掉了,所谓无法 ...

  10. JAVA仓库管理系统(附源码+调试)

    JAVA仓库管理系统--三只松鼠仓库管理系统功能描述(1)登录模块:登录信息等存储在数据库中(2)基本档案管理模块:供货商管理,销售商管理,货品档案管理,仓库管理(3)采购订货模块:用户可以通过查询条 ...