1.指针含义
计算机在存储数据的时候必须跟踪3种基本属性
1.存储位置
2.存储的值
3.存储的信息类型
指针是一个变量,存储的是地址。 所以指针本质是一个地址!看到指针条件反射想到地址。
对于一个常规变量,&运算符就能够取得他的地址。所以一个变量var,那么&var就是一个地址。
输出地址是以十六进制来输出的。
对于一个指针变量pointer,*pointer表示解除引用,将其应用于指针,可以得到该地址存储的值。且这个值就是常规的值。
#include <iostream>
int main()
{
int a=3;
std::cout<<"the address of a:"<<&a<<std::endl;
int* p_a=&a;
std::cout<<"the value of p_a is:"<<p_a<<std::endl;
std::cout<<"*p_a:"<<*p_a<<std::endl;
return 0;
}
运行结果
可以知道,这里的int变量和指针变量就像同一个硬币的正反面。变量表示值,可以使用&来得到地址。 指针变量表示地址,并且可以使用*来得到值 .
p_a和a就是等价的。这个一定要知道,是后面修改的基础。&(取址运算符)和(间接访问运算符/解引用指针)。
2.指针的应用
交换a,b的值
#include <iostream>
using namespace std;
void swap1(int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
int main()
{
int a = 1, b = 5;
cout << "交换前:" << endl;
cout << "a:" << a << " " << "b:" << b << endl;
swap1(&a, &b);
cout << "交换后:" << endl;
cout << "a:" << a << " " << "b:" << b << endl;
system("pause");
return 0;
}
运行结果
通过指针来交换a,b的地址,来达到交换a,b值的目的,如果不使用指针,而是直接将实参a,b传给形参,最终结果a,b的值并不会交换。
还有一种不使用指针的方法来达到交换的目的,就是使用引用&。程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。
#include <iostream>
using namespace std;
void swap1(int &a, int &b)
{
int c;
c = a;
a = b;
b = c;
}
int main()
{
int a = 1, b = 5;
cout << "交换前:" << endl;
cout << "a:" << a << " " << "b:" << b << endl;
swap1(a, b);
cout << "交换后:" << endl;
cout << "a:" << a << " " << "b:" << b << endl;
system("pause");
return 0;
}
运行结果
3.*和&的多重含义
*和&既能用作表达式里的运算符,也能作为声明的一部分出现,符号的上下文决定了符号的意义:
int i = 42;
int &r = i; //&紧随类型名出现,因此是声明的一部分,r是一个引用
int *p; //*紧随类型名出现,因此是声明的一部分,p是一个指针
p = &i; //&出现在表达式中,是一个取地址符
*p = i; //*出现在表达式中,是一个解引用符
int &r2 = *p; //&是声明的一部分,*是一个解引用符
4.指针使用时需要注意的点(持续更新):
- 1,初始化所有指针,使用未经初始化的指针是引发运行时错误的一大原因。如果真的不清楚指针应该指向何处,就把它初始化为
nullptr
或者0
。 - 2,
网友评论