指针和数组
指针:一个基本的数据类型加上“*”就构成了一个指针类型的模子。这个模子的大小是一定的,与“*”前面的数据类型无关,只与你在哪个操作系统下操作有关(例如在32位心系统下,不管是什么样的指针类型,其大小都为4byte)。“*”前面的数据类型只是说明指针所指向的内存里存储的数据类型。
指针和数组的关系
首先指针和数组之间没有任何的关系
指针就是指针,指针变量在32位系统之下,永远占四个字节,其值为某一个内存的地址。指针可以指向任何地方,但不是任何地方你都能通过这个指针变量访问到。
数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据,但不能存函数。
指针数组和数组指针
指针数组:首先它是一个数组,数组的元素都是指针。数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32位系统下永远是占4个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
下面有两个例子:
1、int *p1[];
2、int (*p2)[];
首先[]的优先级比"*"高,所以p1会先与"[]"结合,构成一个数组,因此(1)就是一个指针数组,数组里面包含十个元素,每个元素都是指向int类型数据的指针。到此(2)就更好理解了,"()"的优先级比"[]"高,所以先p2与"*"结合形成一个指针,这个指针指向一个匿名数组,这个数组里面包含着十个int类型数据,所以它是数组指针。
函数指针:就是函数的指针,它是一个指针,指向一个函数。
举个例子:
char* (*fun1)(char* p1,char* p2)
看到这个应该很容易想到前面的数组指针,两者的形式应该很相似,其中fun1不是函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。
函数指针数组:
定义:一个指向函数的指针存储在一个数组中。就像指针数组一样,但是数组中存储的指针指向的东西不一样,函数指针数组中的指针指向的是一个函数。
例子:
char* (*pf[3])(char* p)
这是一个数组,数组名为pf,数组内部存放了三个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针、参数为一个指向字符的指针的函数。是一个数组,指针数组。
函数指针数组的指针
和数组指针一样,这是一个指针,指向一个数组,这个数组里面存的都是指向函数的的指针。
例子:
char* (*(*pf)[3])(char* p)
先看pf,在这里pf是一个指针,其指向的是一个数组,数组里面有三个元素,存的是指向函数的指针,这些指针指向一些返回值为字符的指针、参数为字符的指针的函数。是一个指针,数组指针。