情况一:
#include<stdio.h>
void modify(int *p){
p = NULL;
}
int main(){
int x = 10;
int *p = &x;
printf("%d\n",*p);//10
modify(p);
printf("%d\n",*p);//10
}
C语言中函数是传值的,在这个modify函数中,传入的是p指针的副本,在函数内部修改的p指针在外部不体现,如果要修改指针p指向的值,应该用指针的指针,因为p也是一个变量
情况二:
#include<stdio.h>
void modify(int **p){
*p = NULL;
}
int main(){
int x = 10;
int *p = &x;
printf("%d\n",*p);//10
modify(&p);
printf("%d\n",*p);//报错,因为现在指向的NULL这个地址没有存变量
}
这里modify传入的是*p的指针**p,也就是指向指针p的指针,在函数内部修改的是指针p的值,也就是说修改的是指针p指向的地址,原来指向的是x的地址,现在修改成指NULL的地址
*p是一个变量,而变量的指针指向的是变量的地址
情况三:
#include<iostream>
using namespace std;
void modify(int& p){
p = 20;
}
int main(){
int x = 10;
printf("%d\n",x);
modify(x);
printf("%d\n",x);
}
这是C++的代码,上面的两个都是C语言代码。
&在C++中除了取变量的地址int *p = &x
外,还有一个作用是引用地址,在上面的代码中,函数的参数是int& p
它表示p的地址的引用,可以理解为它是x的别名,本质上是一个变量,也就是说在函数内部对p的操作就是在对x的操作,这不是副本,和传值是不一样的
情况四
#include<iostream>
using namespace std;
int main(){
int x = 10;
int* px = &x; // px 是 x 的地址
int y = *&x; // y 的值等于 x 的值
}
void modify(int*& p) {
p = nullptr; // 修改 p 的值
}
int main() {
int x = 10;
int* p = &x;
modify(p);
// 现在,p 的值是 nullptr
}
情况五
int main(){
int x = 10;
int* p = &x;
//以下三个输出均是x的地址
printf("&x = %d\n",&x);
printf("p = %d\n",p);
printf("&*p = %d\n",&*p);//*p就是x
}