函数传指针与传值特容易混淆的点
这里只做一部分的解析,详解请参考 指针参数传递动态内存 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;
}