【C++】*和到底如何使用?关于指针的一些理解
在学习C++的过程中,对*和&两个符号的作用有些疑惑与混乱,在观看up小傻羊驼的讲解视频后有所收获,进行笔记记录。
指针
1、先聊聊在声明中 * 的作用
在指针的定义中我们知道指针也就是内存地址,指针变量是用来存放内存地址的变量。
int a; //a是一个整形变量
int * p; //p是一个整形指针变量
没错,在声明变量时,*号的作用是一个标志,标志着声明的这个变量是一个指针变量,在上面的例子中,int和int* 的作用是一样的,都是声明这个变量的类型,只不过int表面后面的变量是整形变量,而int*表明后面的变量是指针变量。
char * p; //当然也可以定义别的类型的指针变量
int * p;
int* p;
int *p; //而*前后的空格是不影响的,这三行的声明效果是一样的
2、& 的作用
&又可以称为取址符,顾名思义其作用是引用地址。对于上面int a这样子的变量声明,变量a一定是有一个地址的。而&a指的就是a的地址。
可以理解使用 & 是从变量到地址。
int a = 1;
printf("%d", a); //这行代码会打印出a的值 1
printf("%d", &a); //这行代码会打印出存储a的地址
而指针变量可以存储地址。
int a = 1;
int * p;
p = &a;
printf("%d", &a);
printf("%d", p); //这两行代码的输出是一样的
3、* 的作用
上面说过了在声明中 * 的作用,除此之外,* 的作用是“解引用”。
可以理解使用 * 是从地址到变量。
int a = 1;
int * p;
p = &a;
printf("%d", p); //这两行代码输出a的地址
printf("%d", *p); //这两行代码输出a的变量
经过上面的分析, * 和 & 的作用是互逆的。
4、 这么设计的意义
void swap(int a, int b) // 形参是整形变量
{
int t = a;
a = b;
b = t;
}
int main()
{
int a = 1;
int b = 3;
swap(a, b);
printf("a = %d b = %d", a, b);
}
运行上面代码会得到如下输出:
a = 1 b = 3
可以得知,swap函数交换的只是形参,在主函数中的a和b的值事实上是没有被交换的。
那么如何交换a和b的值呢?这里需要对a和b的地址进行操作。
void swap(int *a, int *b) // 形参是指针变量
{
int t = *a;
*a = *b;
*b = t;
}
int main()
{
int a = 1;
int b = 3;
swap(&a, &b); // 需要传入的是指针变量
printf("a = %d b = %d", a, b);
}
运行上面代码会得到如下输出:
a = 3 b = 1