第一个问题:
int A = 2;
int* p = &A;
*p = 3;
printf("A的值:%d\nA的地址:%d\n", A,&A);
printf("p的值:%d\np的地址:%d\n", p, &p);
输出是什么?
int* p的*号表示声明一个指针
*p=3 的*表示对指针p中存储的地址进行解引用
int* p=&A
printf(“A的值:%d\nA的地址:%d\n”, A,&A);
printf(“p的值:%d\np的地址:%d\n”, p, &p);
&的意思是取A和指针p的地址
第二个问题:
int A = 2;
int& p = A;
p = 5;
printf("p的值:%d\np的地址:%d\n", p, &p);
printf("A的值:%d\nA的地址:%d\n", A, &A);
输出是什么?
int& p=A
这里的&不再是对p取地址,而是引用的意思
通过结果可以发现,无论是地址还是值,p都与A相同,同时改变p的值,A也会一起改变,
简单来说,p就是A的另一个名字,同体不同名字。
&在变量定义区,表示引用
int& p = A;
&在变量操作区,表示取地址符
int* p = &A;
接下来再说一下让人最头疼的函数中参数是*,*&,&的区别
继续看例子:
void fun1(int& x)
{
x = 25;
}
void fun2(int* x) {
*x = 15;
int k = 3;
x = &k;
}
void fun3(int* &x)
{
*x = 10;
int k=4;
x = &k;
}
注意: 在函数参数中&没有取地址的作用,只有引用的作用
fun1的参数是&x表示引用传入的实参
fun2的参数是int型指针
fun3的参数是引用传入的实参指针
通过代码来看一看,是怎么操作的:
先看第一个函数:
void fun1(int& x)
{
printf("函数中参数的信息:\n");
printf("x的地址:%d\n\n",&x);
x = 25;
}
int main()
{
int A = 5;
printf("A的值:%d\nA的地址:%d\n\n", A, &A);
fun1(A);
printf("A的值:%d\nA的地址:%d\n", A, &A);
}
运行结果:
可以发现参数x,与实参A的地址都是一样的,
结论:
fun1(int& x)
函数参数中的引用,就相当于这个参数为这个实参的另一个名字,函数中的参数怎么改变,实参就怎么改变
再看第二个函数:
void fun2(int* x) {
printf("函数中参数的信息(改变前):\n");
printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x,x,*x);
int temp = 10;
*x = 15;
x = &temp;
printf("函数中参数的信息(改变后):\n");
printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x, x, *x);
}
int main() {
int A = 5;
int* p = &A;
printf("A的地址:%d\n\n", &A);
printf("调用函数之前的信息:\n");
printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
fun2(p);
printf("调用函数之后的信息:\n");
printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
printf("A的值:%d\n", A);
}
运行结果:
A的地址:-1064306940
调用函数之前的信息:
指针p的地址:-1064306904
指针p所存储的地址: -1064306940
对指针p存储的地址解引用:5
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
函数中参数的信息(改变前):
指针x的地址:-1064306976
指针x存储的地址 -1064306940
对指针x存储的地址解引用5
函数中参数的信息(改变后):
指针x的地址:-1064306976
指针x存储的地址 -1064307228
对指针x存储的地址解引用10
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
调用函数之后的信息:
指针p的地址:-1064306904
指针p所存储的地址: -1064306940
对指针p存储的地址解引用:15
A的值:15
通过对结果的观察:
结论:
传入指针p,只是将指针p中的内容给了x,指针x在参数中的任何改变,都不会影响p的地址,p的存储内容。
第三个函数:
void fun3(int* &x)
{
printf("函数中参数的信息(改变前):\n");
printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x, x, *x);
int temp = 5;
*x = 10;
x = &temp;
printf("函数中参数的信息(改变后):\n");
printf("指针x的地址:%d\n指针x存储的地址 %d\n对指针x存储的地址解引用%d\n\n", &x, x, *x);
}
int main() {
int A = 5;
int* p = &A;
printf("A的地址:%d\n\n", &A);
printf("调用函数之前的信息:\n");
printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
fun3(p);
printf("调用函数之后的信息:\n");
printf("指针p的地址:%d\n指针p所存储的地址: %d\n对指针p存储的地址解引用:%d\n\n", &p, p, *p);
printf("A的值:%d\n", A);
}
代码和第二个函数基本一样,主要改变的就是传入参数的符号*&
A的地址:-258999548
调用函数之前的信息:
指针p的地址:-258999512
指针p所存储的地址: -258999548
对指针p存储的地址解引用:5
函数中参数的信息(改变前):
指针x的地址:-258999512
指针x存储的地址 -258999548
对指针x存储的地址解引用5
函数中参数的信息(改变后):
指针x的地址:-258999512
指针x存储的地址 -258999836
对指针x存储的地址解引用5
调用函数之后的信息:
指针p的地址:-258999512
指针p所存储的地址: -258999836
对指针p存储的地址解引用:-858993460
A的值:10
通过观察结果我们的出结论:
传给参数x的指针p,指针x在参数中怎么改变,指针p就怎么改变
还是和之前一样,这个参数就相当于是传入实参的另一个别名