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. 关闭win10“快速启动”功能

    windows正常运行时间的统计问题 windows任务管理器中,在性能选项卡中可以查看系统的运行时间(开机时间) 正常情况下,如果电脑关机,那么再次开机后,该时间会被重置 但是,如果电脑处于上面所说 ...

  2. 从main_phase跳回reset_phase的方式

    在main_phase中调用: phase.jump(uvm_reset_phase::get()); 注意需要防止进入死循环.

  3. The Semantics of Constructors——2.4 成员初始化列表

    2.4 成员初始化列表(Member Initialization List) 当你写下一个constructor时,就有机会设定class members的初值.要不是经由member initia ...

  4. Qt学习笔记(一) 关于QWidget类的paintEvent方法

    今天要讨论的也算是QT的核心之一了,那就是如何对widget进行重绘,这里就是可以看到,继承了QWidget的子类,自己重新写一个paintEvent函数就可以了. 这个paintEvent就相当于是 ...

  5. docker的使用以及常用命令

    查看docker镜像仓库中是否存在某个镜像,通常第一个或stars最多的就是我们要是使用的,以nginx为例 # 搜索一下是否存在该镜像文件 docker search nginx # 安装使用该镜像 ...

  6. Flutter 中的普通路由、普通路由传值、 命名路由、命名路由传值

    一.Flutter 中的路由 Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push ...

  7. How to Fix SSH Failed Permission Denied

    https://phoenixnap.com/kb/ssh-permission-denied-publickey

  8. C# snaps

    C# 启用 禁用 本地连接 1 static void Enable(string interfaceName) 2 { 3 System.Diagnostics.ProcessStartInfo p ...

  9. 【快速学】C/C++编译器

    编译器 谁维护 平台 版权 Visual C++ Microsoft https://visualstudio.microsoft.com/ Microsoft Windows 有免费版 GCC C ...

  10. pgsql 数据库密码登录配置

    一.postgreSQL认证文件 pg_hba.conf 配置文件pg_hba.conf的位置,通常情况下的路径是 /etc/postgresql/[VERSION]/main/pg_hba.conf ...