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

posted @ 2022-12-03 23:05  小千北同学超爱写代码  阅读(582)  评论(0编辑  收藏  举报