正文

指针2009-02-26 10:37:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/41058.html

分享到:

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;//定义整型变量xy和整型指针变量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中的容器和MFCafxtempl的实现机制。

参阅:

内存和地址

参考:

《白话C++》南郁

《指针》http://blog.csdn.net/lovemy/archive/2006/01/05/571245.aspx

《void类型指针在程序中的用途》http://topic.csdn.net/t/20041020/19/3475259.html

《二级指针的妙用》http://blog.csdn.net/nice_guy/archive/2006/07/13/914868.aspx

C++ Pointershttp://alfps.izfree.com/tutorials/pointers/

C/C++ Pointershttp://www.netcore2k.net/articles/pointers

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

 http://flightline.highline.edu/rkang/151/Tut/15.pdf

阅读(2975) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册