【c++】5.函数传指针与传值特容易混淆的点

函数传指针与传值特容易混淆的点

这里只做一部分的解析,详解请参考 指针参数传递动态内存 https://blog.csdn.net/daaikuaichuan/article/details/77229599

参考 https://bbs.csdn.net/topics/240071177

传指针的目的是改变指针指向单元的值,而不是改变指针本身(即指针表示的地址).

如果函数参数是指针类型,需要具体分析:
见后面的代码中:
void swap1(int *p1, int *p2) 是传值,只不过这个值是个指针(地址);
void swap2(int *p1, int *p2)是传指针,在函数内部是更改p1和p2指向的值,这也是我们最常用的方式。
如果函数内部是改变指针的指向(地址),则相当于传值,虽然在函数内形参p1和p2指针指向改变了,但是调用了该函数之后,形参对应的实参p1和p2的指向地址完全没改变。
p1,p2 是通过值传入函数的,只不过这个值是个指针(地址),可看作函数局部变量。

#include <string.h>

#include <iostream>
#include <map>
#include <string>
#include <vector>

// g++ -std=c++11 main.cpp -o main

/***
// 此函数改变的是指针指向,不是指针指向地址的值。
void GetVersion(char *pStr) {
  pStr = new char(100);
}

int main() {
  char *version = NULL;

  GetVersion(version);

  printf("String = %s,  Address = %u\n", version, version);

  delete version;
  return 0;
}
***/

// 改变指针的指向(地址),相当于传值,虽然在函数内形参p1和p2指针指向改变了,但是调用了该函数之后,形参对应的实参p1和p2的指向地址完全没改变,交换失败
// p1,p2 是通过值传入函数的,只不过这个值是个指针(地址),可看作函数局部变量。
void swap1(int *p1, int *p2) {
  std::cout << "p1= " << p1 << std::endl;
  std::cout << "p2= " << p2 << std::endl;
  int *temp = NULL;
  if (*p1 < *p2) {
    temp = p1;
    p1 = p2;
    p2 = temp;
  }
  std::cout << "p1= " << p1 << std::endl;
  std::cout << "p2= " << p2 << std::endl;
}

// 改变指针指向的内容,交换成功
void swap2(int *p1, int *p2) {
  int temp = 0;
  if (*p1 < *p2) {
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
  }
}

// 传指针的目的是改变指针指向单元的值,而不是改变指针本身(即指针表示的地址).
int main(int argc, char *argv[]) {
  int a = 2, b = 3;
  std::cout << "a= " << a << " , "
            << "b= " << b << std::endl;
  int *pointer_1, *pointer_2;
  pointer_1 = &a;
  pointer_2 = &b;
  std::cout << "pointer_1= " << pointer_1 << std::endl;
  std::cout << "pointer_2= " << pointer_2 << std::endl;

  swap1(pointer_1, pointer_2);
  std::cout << "swap1:" << std::endl;
  std::cout << "*pointer_1= " << *pointer_1 << " , "
            << "*pointer_2= " << *pointer_2 << std::endl;
  std::cout << "pointer_1= " << pointer_1 << std::endl;
  std::cout << "pointer_2= " << pointer_2 << std::endl;

  swap2(pointer_1, pointer_2);
  std::cout << "swap2:" << std::endl;
  std::cout << "*pointer_1= " << *pointer_1 << " , "
            << "*pointer_2= " << *pointer_2 << std::endl;
  return -1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值