在计算机科学中,指针(Pointr)是编程语言中的一个对象,它也是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,Java一般避免用指针,改为使用引用。指针是一个无符号整数(unsigndint),它是一个以当前系统寻址范围为取值范围的整数。
指针有两种含义,一是作为数据类型,二是作为实体。指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量。指针作为数据类型,可以从一个函数类型、一个对象类型或者一个不完备类型中导出,从中导出的数据类型称之为被引用类型(rfrncdtyp);指针类型描述了一种对象,其值为对被引用类型的实体的引用。
我们需要搞清指针四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。
指针的类型:
从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。
int*ptr;//指针的类型是int*char*ptr;//指针的类型是char*int**ptr;//指针的类型是int**int(*ptr)[2];//指针的类型是int(*)[2]int*(*ptr)[6];//指针的类型是int*(*)[6]
指针所指向的类型:
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
int*ptr;//指针所指向的类型是int
char*ptr;//指针所指向的的类型是charint**ptr;//指针所指向的的类型是int*int(*ptr)[2];//指针所指向的的类型是int()[3]int*(*ptr)[6];//指针所指向的的类型是int*()[4]指针的值:
指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizof(指针所指向的类型)的一片内存区。我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
指针本身所占据的内存区:
在32位平台里,指针本身占据了4个字节的长度。计算机中的内存都是编址的,就像你家的地址一样。在程序编译或者运行的时候,系统开辟了一张表。每遇到一次声明语句(包括函数的传入参数的声明)都会开辟一个内存空间,并在表中增加一行纪录,记载着一些对应关系。
指针的定义:
1.变量指针
存放地址的变量称为指针变量,空指针是一个特殊的指针,它的值是0,C语言中用符号常量NULL(在stdio.h中定义)表示这个空值,并保证这个值不会是任何变量的地址。空指针对任何指针类型赋值都是合法的。一个指针变量具有空指针值表示当前它没有指向任何有意义的东西。(void*)类型的指针叫通用指针,可以指向任何的变量,C语言允许直接把任何变量的地址作为指针赋给通用指针。但是有一点需要注意void*不能指向由const修饰的变量。
int*p=0;//定义指针p,并初始化指针为0,即指向的地址为/********************************/
inta=0;//定义初始化常量aint*p;//定义指针pp=a;//或*p=a;指针p指向a的地址,即指针获取地址
2.数组指针
数组指针:apointrtoanarray,即指向数组的指针,其本质为指针;指针数组:arrayofpointrs,即用于存储指针的数组,也就是数组元素都是指针,其本质为数组。
inta[]={0,1,2,3,4,5,6,7,8,9};//定义数组
int*p=a;//定义并赋值数组指针,即获得数组的首地址
int*p[4]指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i]*(a[i])是一样的,因为[]优先级高于*
/*********************************/
int(*p)[4]数组指针,定义了p[0],p[1],p[2]三个指针
表示:指向数组a的指针
元素表示:(*a)[i]
3.函数指针
指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针。
int*f(inta,intb);
函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象。
int(*f)(inta,intb);//声明函数指针
注:定义了指针一定要知道指针指向哪里!!!
治疗头部白癜风白癜风的初期症状表现