[自用初学]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