欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;

打印结果:
C++指针小结

再来看一段代码:


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;

打印结果:
C++指针小结

相关标签: C++