指针

系统 1902 0

1 .指针,变量的指针,指针变量

由于通过地址能找到所需的变量单元,我们可以说,地址“指向该变量单元”,在 C 语言中,将地址形象化的称为“ 指针 ”,一个变量的地址称为该“ 变量的指针 ”,意思是通过它能找到以它为地址的内存单元。指针的值是指针本身存储的数值, 这个值将被编译器当作一个地址 ,而不是一个一般的数值。

32 位程序里,所有类型的指针的值都是一个 32 位整数。因为 32 位机中的程序里内存地址全都是 32 位长,即 sizeof (pointer) 的值总为 4 —指针本身占据了 4 个字节的长度。在 64 位机中, sizeof (pointer) 的值为 8.

如果一个变量专门用来存放另一个变量的地址,则它称为“ 指针变量 ”,我们说它用来存放指针。定义了一个变量 p ,它用来保存另一个变量 var 的地址,这样的 p 就是指向 var 的指针变量。

指针变量也是变量,其定义格式为: 类型标识符 * 指针标识符 * 号为 (地址解析符, 表示“指向……的指针”,可以左结合,也可以右结合,其中 类型标识符 * 为指针的类型, 类型标识符 为指针所指向的类型。例如:

char *pc; pc 具有 char * 类型,即 pc 指向 char 类型的变量,以 1 个字节为一个存取单元。

int *pi; pi 具有 int * 类型,即 pi 指向 int 类型的变量,以 4 个字节为一个存取单元。

float * pf; pf 具有 float * 类型,即 pf 指向 float 类型的变量,以 4 个字节为一个存取单元。

char *pc= "hello" ; <==> char *pc;pc= "hello" ;

2 .指针变量的引用

C 语言中对 指针变量的引用主要通过运算符“ & ”和“ * ”来实现的。

& ——取变量的地址。

* ——取指针变量所指向的变量的值。

观察下面的程序段:

int x,y,*p; // 定义整型变量 x y 和整型指针变量 p

x=168; // 初始化 x

p=&x; // 初始化 p

y=*p; // 初始化 y

上述内存变化情况如图所示:

指针

int a=168; int *p=&a; *&a 表示变量 a 本身,而 &*p=&a, 表示去变量 a 的地址。

3 .指针的算术运算

int x,y,*p=&x; 假设 x,y,p 顺序存放:

原操作

等价操作

y=*++p;

p=p+1;y=*p;

y=*p++;

y=*p;p=p+1;

y=(*p)++;

y=*p+1;

y=*(++p);

p=p+1;y=*p;

y=*--p;

p=p-1;y=*p;

y=*p--;

y=*p;p=p-1;

y=(*p)--;

y=*p-1;

y=*(--p);

p=p-1;y=*p;

4 .指针数组

指针数组和普通数组没什么区别,只不过其元素是指针。指针数组实际存储的是一系列和指针同类型变量的地址。

// 示例 1

char c = 'H' ;

char * s = "Hello" ;

char str [] = "Hello" ;

char charArray [6] = { 'H' , 'e' , 'l' , 'l' , 'o' , '/0' };

char * pChar [5];

pChar [0] = & c ;

pChar [1] = "Hello" ;

pChar [2] = s ;

pChar [3] = str ;

pChar [4] = charArray ;

// 示例 2

int * n0 , n1 , n2 ;

int * pInt [3];

pInt [0] = n0 ;

pInt [1] = & n1 ;

pInt [2] = & n2 ;

5 .指针的指针

指针的指针本质还是指针,就是用来存放指针变量的地址。

指针

对于返回二级指针的函数 void** GetNextPtr (void* pNode ); 我们可以对返回结果进行操作: * GetNextPtr (pNode) = pHead;

我们可以用函数返回值来传递动态内存,例如 void * malloc ( size_t size ); 但是试图用指针参数去申请内存是做不到的,只能用“指向指针的指针”。参考《高质量 C++ 编程指南》第 7 章—内存管理— 7.3.3 计算内存容量。

以下利用二级指针实现链表 List 的分槽存储:

typedef struct tagNode

{

tagNode * pNext ;

int n ;

void ** pData ; // pData 指向 void* pSlot[n] 数组的首地址

} List ,* pList ,* pThreadData ;

指针

实际上 List 可以存放任意大小任何类型的数据(包括类) , 在线程局部存储 TLS 中我们将见到这种分槽存储结构 pThreadData 。同时,我们也可以由此思考标准 C++STL 中的容器和 MFC afxtempl 的实现机制。

参考:

《白话 C++ 》南郁

内存

void 类型指针在程序 的用途

二级指针的

C++ Pointers

C/C++ Pointers

Pointers in C/C++ By Value,By reference, Pointer Arithmetic

指针


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论