[自用初学]c++值传递和引用传递/ *&/ string
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的更多相关文章
- JavaScript:函数:函数传参传的是什么?值传递还是引用传递?
我们调用函数的时候,把实参放入到括号里进行传参,让形参接收实参的数据. 在这个过程中,形参接收的数据到底是什么,换句话说,我们传参传的到底是什么东西? 初学JS的,可能不太难理解这个问题的意义是什么? ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java的值传递和引用传递
昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...
- PHP值传递和引用传递的区别
PHP值传递和引用传递的区别.什么时候传值什么时候传引用 (1)按值传递:函数范围内对值的任何改变在函数外部都会被忽略 (2)按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改 (3)优 ...
- JavaScript 函数参数传递到底是值传递还是引用传递
tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里 ...
- 【转载】C++ 值传递、指针传递、引用传递详解
原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- java 对象传递 是 值传递 还是 引用传递?
这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...
随机推荐
- WIN10操作系统如何利用无线网卡连接wifi再通过有线网卡共享网络给路由(双网卡)
首先有一台笔记本电脑,或者双网卡的电脑(wifi网卡 和 有线网卡) 找到两个个网卡,并重置他们的设置 然后同时选中,右单击选择桥接 桥接成功以后就可以用无线网卡连接wifi,然后把有线网口插上网线直 ...
- ptyhon基础课程_3
14 综上练习题 评分规则: A:>=90 B:>=80 C:>=70 D:其他 用户输入成绩,根据成绩显示不同的级别 score = input ("请输入您的成绩:&q ...
- linux环境通过nginx转发allure报告
前言: 自动化测试生成的allure报告一般通过jenkins生成,生成后通过jenkins的view账号进行查看,但这样就必须登录jenkins才能看到,如何不通过登录jenkins从而看到al ...
- KiCad,一款开源的PCB设计软件
Kicad,一款开源的PCB设计软件 1.偷偷摸摸久矣 还记得是大二的实践课,用Protel99se设计一款PCB,把电路图转印到铜板上并腐蚀出来,然后钻孔.焊接,那时候的软件是真难用,后面自学了Al ...
- oracle之如何获取执行计划方法
1.什么是执行计划 为了执行sql语句,Oracle在内部必须实现许多步骤,这些步骤可能是从数据库中物理检索数据行,或者用某种方法来准备数据行等,接着Oracle会按照一定的顺序一次执行这些步骤,最后 ...
- CAD怎么删除图块注释?删除CAD图块注释步骤
CAD设计过程中,有时候会在图纸中添加许多注释,如:文字注释,图块注释,标注样式注释等.当需要删除图纸中的CAD图块注释时,你知道该如何操作吗?本节课程小编就来给大家分享一下浩辰CAD软件中删除CAD ...
- 论文笔记:Access Path Selection In A Relational Database Management System
论文笔记:Access Path Selection In A Relation Database Management System 这篇文章是 1979 年由 IBM 发表的.主要介绍了 Syst ...
- DELL服务器基于centos7安装OMSA
DELL服务器基于centos7安装OMSA 参考链接: https://www.cnblogs.com/sky-cheng/p/14951071.html https://www.dell.com/ ...
- Unit mysqld.service could not be found.
具体命令 service mysqld status systemctl status mysqld 结果 Unit mysqld.service could not be found. 查看mysq ...
- c#遍历一个对象的字段信息
c#遍历对象字段 场景:有一个对象作为导出word段落的数据.每一个字段就代表一个段落,可以对相应段落数据设置样式(字体.颜色.加粗--) 参考文献:(12条消息) C#获取实体类字段信息Proper ...