指针与指针变量
易知常说的指针一般指的是地址,地址是某内存的索引,本质只是一个无符号整数,能够寻址,指可以通过地址获得内存的内容,所以指针指向一个函数或一个变量,即表示地址代表的内存为一个变量或函数拥有,地址部分可以从计算机基础书籍理解。
指针变量是一种变量,与基本变量int,char等一样,有其固定的内存(说的是大小不变,位置不变即是变量的地址不变),与整型变量不同,整形int 存放整数,指针变量用以存放指针(即地址,也明了指针存在便是为了指向变量的所在,通过获得变量地址便可操作对应变量内容)。
指针变量的内存
易知指针变量地址大小是4字节(指32位机中),注意内存以一字节为一内存单元,以一内存单元为单位进行编位,则4Byte=32bit,可以表示范围为2^32=4GB(内存范围用十六进制可表示:0x0000 0000~0xFFFF FFFF),以便内存中所有地址能被指向,因此指针能指向内存中所有的地址,无超出范围之说(机器不同,指针的内存大小不一样,是为了能全部指向所有内存)。
指针的指向
普通变量(指int,char,float 等),可以被指针指向(通过将地址赋值给指针),当然也可指向指针类型(但知道要将指针定义为与变量相同类型,所以指向指针变量的指针定义时有两颗星星type **ptr,表示双重指针,可以指向指针的地址),以&取地址赋值int *p = &Var,以*对指向的内容间接操作,*p=data;
一维数组名S(type S[])指向第一个元素地址(S == &S{0]),其是一个常量指针常量(指向常量的指针常量,指其指向不可变,指向的内容不可变 ),亦说明了对数组名赋值是错误的,可以将数组名赋值给对应类型的指针变量,此时,指针指向第一个数组元素,可以*p操作,p++指指针增加一个类型的地址,指向下一个元素。
二维数组名是带两颗星星指针,可以用指向指针的指针变量表示,是一维数组的指针,如type S[2][3],可以看做两个一维数组,S[0][3],S[1][3],S指向S[0],S+1一个指向S[1],可知S[0]此时也为一个地址,S[0]指向S[0][0](S[0] == &S[0][0])S[0]+1指向S[0][1](S[0] +1== &S[0][1]),S[1]指向S[1][0](S[1]== &S[1][0]) ,S[1] +1指向S[1][1](S[1] +1== &S[1][1])...... 因此不能将二维数组名直接赋值给指向一重指针,只能将S[0]或&S[0][0]赋值给带一颗星星的ptr1(type *ptr1),而将S赋值给两颗星星的ptr2(type **ptr2,也可以将普通变量看做(type) (),指针看做(type) *(),(*只为了说明是指针)类型,而指向指针变量的指针变量应为:(type *) *()。
所有的指针变量内存大小都是一样的,结构体的指针也是一样的,并不因其内部定义而改变,例如整型数组指针与整形的指针定义显然是一样的,而不管在结构体内部或外部定义的结构体指针是同一类型,指内存大小一样,所指类型一样,都是指向结构体,也可以将结构体指针看做指向其首地址,结构体指针指向结构体的方法为:将结构体变量地址赋值,struct Str *p = &StruVar;第二种是,申请一段结构体内存,并将其首地址赋值给指针,Struct Str *p = (Struct Str*)malloc(sizeof(Strruct Str)); 此时结构体无名字(指变量名字),惟有指针指向。