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》
分享到:
相关推荐
彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc
鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载Yangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong ...
指针是C语言的精华,然而,很多人学习了 C 基础知识却始终对 C 指针不得要领,长期被 C 指针困扰,所以给大家推荐此书,本书作者运用了许多生动与亲切的例子,深入浅出地讲透了 C指针的原理与机制,并辅以编程实践中...
本篇文章收集了近一年来所有关于智能指针的面试相关内容。以智能指针的面试题线索,穿插讲解完最常用的四种智能指针的各个方面。本文讲解4个智能指针的基本概念和特性,以及其他设计到的知识点。讲解的过程中,如果...
运行界面是一指针式时钟,包括时分秒三个指针,有12个钟点的显示,并通过指针的转动来实时更新时间。通过菜单可以进行闹铃设置、指针颜色设置和自己设置时间。 三、 系统分析与设计 1、 系统分析 指针式时钟,要求有...
我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面 的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10] def是什么? (2)double*(*gh)[10] gh是什么? (3)double...
指针数组: 1.a 被初始化为一个由5个int 整数构成的数组。 2.在一个表达式里,*p[] 将被求值为一个int 整数,所以p[]必须指向一个int 整数,而p是一个int 指针数组。指针数组p里的5个元素(5个)指针被初始化为分别...
10.7 指针数组和指向指针的指针 10.7.1 指针数组的概念 一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。 指针...
《彻底搞定 C 指针》是互联网上下载次数最多的针对 C 指针问题的中文资 源之一。现在,经由修订者的重新修订、编辑与排版,本书的《完全版·修订增 补版》全新登场。新版本中的技术用语更加清楚严谨,行文的结构层次...
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大 学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是...
指针是C语言中的精髓,但也是难点。我这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练...
易语言取类指针及方法指针源码,取类指针及方法指针,线程调用,取方法指针,方法1,方法2,lstrcpynA
指针 指针教程 指针练习指针 指针教程 指针练习
彩色荧光鼠标指针鼠标指针
大家都非常熟悉火影,很多朋友喜欢火影中的各种人物,今天小编给大家推荐一款火影忍者鼠标指针工具,该指针有运行、单击、帮助等多款指针任您选择。欢迎火影迷下载体验。 鼠标指针使用方法 1、压缩目标下有一个setup...
void指针void指针void指针void指针void指针
C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针C指针
本文是学习C++的基础内容,指针是C或C++所特有的,因此应熟练掌握指针的使用,本文集中介绍C或C++中的各种指针,包括指针数组,数组指针,常量指针,指向指针的指针,尤其是对二维数组和指针进行了详细精辟的解释,...
指针变量,指针与数组, 指针与函数, 字符串与指针,指向指针的指针