C++ 指针复习

Posted Crazod

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 指针复习相关的知识,希望对你有一定的参考价值。

 

最近开始准备实习的笔试,复习了一下C++ 指针的内容

在计算机的每一个字节都有一个对应的地址:

很多书上用街道上的门牌比喻:地址使用数字来表示的,就和街道上的门牌号一样。但这样是不甚贴切的,因为存在着二级指针和一个数据存在多个地址等情况。

所以我觉得用字典前面的目录来比喻比较贴切。

在我们的程序中:

先举一个简单的例子,int *p ; 这里表明我们定义了一个指针,也就是说我们在字典的目录里定义了一条目录,但是它指向的内容(值),指向多少页(存放的地址)都是不确定的。

int *pc ;//定义了一个指针
int   ac;
pc = &c ;//这个时候,指针就指向了a
c= 5;//p指向的a 就存了值 5;

cout << pc <<endl;//0034FE88
cout << &c <<endl;//0034FE88
cout << c <<endl;  //5
cout << *pc <<endl;//5
cout << pc + 1 <<endl;//0034FE8C
*pc = 3;
cout << c <<endl;//3
int *pd;
*pd = 4;//error

可以看到,这时,pc存放着数据c的地址,而*pc代表着c中存放的值,改变了*pc也就意味着改变了变量c的值,值得注意的是,pc+1的值并不是代表着pc地址值+1,而是pc地址值+1*int数据所占字节的值。

但是如果一个指针,不进行初始化的话,是不能够进行赋值的,Run-Time Check Failure #3 - The variable ‘pd‘ is being used without being initialized.

 

#include <iostream>
using namespace std;

int main()
{
int a[]={30,21,12,43,34,75};
char b;
int *p = a;
for(int i = 0 ; i<5 ; i++)
cout << *(p++) <<endl;//3,30,21,12,43
int *q = a;    
cout << q <<endl;//0030F978
cout << q+1 <<endl;//0030F97C
cout << *q <<endl;//30
cout << *q+1 <<endl;//31
cout << *(q+1) <<endl;//21
cout << &a[1] <<endl;//0030F97C
cout << &q <<endl;//0030F930
cin>>b;
return 0 ;
}

可以看出,实际上q就存放着数组a的首地址,而q+1就是a[1]元素的地址,*(q+1)就是a[1].

 

以上是关于C++ 指针复习的主要内容,如果未能解决你的问题,请参考以下文章

c++复习笔记——智能指针详细解析(智能指针的使用,原理分析)

c++复习篇

C++ - 指针和“智能指针”

关于c++中的this指针

C++反汇编第二讲,反汇编中识别虚表指针,以及指向的虚函数地址

C++笔试题复习