C++指针小结
程序员文章站
2022-07-03 14:50:27
...
自己对C++学的一知半解,对指针真是又爱又恨。。买了本c++ primer,结合书中的内容重新对指针理解理解。
1指针的组成
声明一个变量,如 int b;则有一个int类型和变量名b组成。
推广到一般的声明,定义声明的构成:基本数据类型+声明符。
指针是一个复合类型。指的是基于其他类型定义的类型。常见的有引用和指针。
声明一个指针
int*p;
解释如下:int为基本数据类型。*p
是声明符。其中*
是类型修饰符。p
是变量名。所以很明显,在这里的指针是一个int的,其组成是int+*p
。所以上述指针的正确声明形式为:
int *p//int后面应有一个空格
int *p,q;//显然*只对p有效,p是指向int类型变量的指针,q是int变量
2指针的含义和本质
指针是一个用来存放某个对象地址的对象(对象即:能储存数据并具有某种数据类型的内存空间)。即指针本身是一个对象,其作用是来储存其他对象的地址。
在这里我们可以认为对象是一个变量(变量是一种命名了的对象)。是一个储存其他变量地址的变量。这就是指针的含义。
我们常说指向变量xx的指针,也就是说指针存放了改变量的地址。
3指针初始化和传递
建议所有指针都进行初始化,避免引起错误。在可能的情况下,尽量等定义了对象之后再定义指向它的指针。
3.1如果不确定可以这么初始化:
//以下三者等价,即都生成了一个空指针
int *p=nullptr;
int *p=0;
int *p=NULL;
3.2一般的情况
//指针是一个地址,所以初始化必须是一个地址或者为空,以下是四种初始化情况
int i = 9;
int ii=99;
int *q1 = &i; //初始化1。这里的&是取地址符,而非表示引用
int *q2 = 0; //初始化2
q2 = &i;//初始化3
int *q3;
q3 = &i;
int *q4 = q3; //初始化4
//显然以上4个指针均指向了i,即*q1=*q2=*q3=*q4=i
//*q4 = i;//赋值语句,非初始化语句。这里的*表示解引用符,而非表示指针
//*q4=ii;//这条语句将ii的值赋给了i,以下输出(该变量以及指向改变量的指针所访问变量的值)全部为99
//常规变量赋值,后面的赋值不应该对前面的有影响
//从这里也可以窥见值传递和指针传递的区别,以及指针传递的实质和强大之处。
std::cout <<"i:" << i << std::endl;
std::cout << "*q1:" << *q1 << std::endl;
std::cout << "*q2:" << *q2 << std::endl;
std::cout << "*q3:" << *q3 << std::endl;
std::cout << "*q4:" << *q4 << std::endl;
return 0;
打印结果:
再来看一段代码:
int i = 9;
int ii = 99;
int *q1 = &i;
int iii = i;//新增变量1
int *q2 = 0;
q2 = &i;
int *q3;
q3 = &i;
int *q4 = q3;
*q4 = ii;//该语句生效
int iiii = i;//新增变量2
std::cout << "i:" << i << std::endl;
std::cout << "*q1:" << *q1 << std::endl;
std::cout << "*q2:" << *q2 << std::endl;
std::cout << "*q3:" << *q3 << std::endl;
std::cout << "*q4:" << *q4 << std::endl;
std::cout << "iii:" << iii << std::endl;
std::cout << "iiii:" << iiii << std::endl;
return 0;
打印结果: