[自用初学]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中只有值传递,没有引用 ...
随机推荐
- 【服务器数据恢复】热备盘同步失败导致数据丢失的raid5数据恢复案例
服务器数据恢复环境:华为s系列服务器:24块硬盘组成一组raid5磁盘阵列,其中包含1块热备盘. 服务器故障&检测:服务器工作状态下raid5中有一块硬盘离线,热备盘激活替换离线硬盘并开始进行 ...
- vscode 远程连接 linux 远程开发
1. 安装拓展 remote-ssh 2. 设置云主机 git 控制台使用命令 ssh-keygen # 生成一个 ssh key # 登录远程主机 # ssh ubuntu@123.123.123. ...
- echarts学习
一.安装与引入 1.安装npm install echarts --save 2.引入import * as echarts from 'echarts';(main.js里全局引入) 二.详细概念 ...
- String和StringBuffer与StringBuilder的区别
1.String.StringBuffer.StringBuilder都不可以被继承,在JDK中它们都被定义为final类. 2.执行速度:StringBuilder > StringBuffe ...
- macos下编译glfw
环境准备 # macos 环境配置,需要预装xcode和cmake brew install cmake # 下载源码 git clone https://github.com/glfw/glfw.g ...
- (K8s学习笔记六)Pod的调度
RC(ReplicationController)只能选择一个标签,RS(ReplicaSet)可选择多个标签,例如APPTest发布了v1和v2两个版本,并希望副本数为3,可同时包含v1和v2两个版 ...
- Vulnhub 靶场 CORROSION: 1
Vulnhub 靶场 CORROSION: 1 前期准备: 靶机地址:https://www.vulnhub.com/entry/corrosion-1,730/ kali攻击机ip:192.168. ...
- win7下virtualbox虚拟机中安装centos后设置共享文件夹
报错信息: building the main Guest Additions module FAILEDunable to find the sources of your current Linu ...
- VUE学习-基础(基础语法 & 模板语法)
基础语法 引入vue <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/ ...
- 你能谈谈HashMap怎样解决hash冲突吗
在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样. 当程序试图将多个 key-value 放入 HashM ...