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

最新文章

  1. 【jQuery 区别】.click()和$(document).on(&quot;click&quot;,&quot;指定的元素&quot;,function(){});的区别
  2. SQL Server 2008 R2——开发资料搜集
  3. 【转】IT管理人才必备的十大能力
  4. HDU 2669 第六周 I题
  5. Vim小知识
  6. [React] Extracting Private React Components
  7. 宏碁宣布Liquid Jade智能机和Leap袖口
  8. js:深闭包(范围:上)
  9. Java内部类基本使用
  10. 漫谈格兰杰因果关系(Granger Causality)——第一章 野火烧不尽,春风吹又生
  11. .net core引用错误的Entity Framework而导致不能正常迁移数据的解决办法
  12. [Swift]LeetCode975. 奇偶跳 | Odd Even Jump
  13. 解决问题:怎样在页面获取数组和List集合的长度
  14. springboot学习一:快速搭建springboot项目
  15. office 2016 破解教程
  16. 团队-爬取豆瓣电影TOP250-需求分析
  17. OpenGL学习记录
  18. pickle 继承
  19. 调用WScript.Shell时产生Automation 服务器不能创建对象的错误
  20. 【Unity】8.2 GUI Style和GUISkin

热门文章

  1. [笔记]windows cmd常用命令
  2. (Python)email 邮件发送
  3. Vue2+Cesium1.9+热力图开发笔记
  4. IDEA使用fastjson1时maven引入依赖没报错,但是用不了JSONObject工具类
  5. windows sshd powershell 配置
  6. 【Chrome】Chrome浏览器设置深色背景
  7. FB50 过帐码 没有定义
  8. Installation requirements for DB2 UDB 8.1 Enterprise Servers
  9. c语言 开灯问题 vs2019编译通过
  10. Python学习笔记组织文件之将美国风格日期的文件改名为欧洲风格的日期