指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针

指针数组

●在C语言中,数组元素全部为指针的数组称为指针数组。在32位系统中,指针占4个字节的大小,所以指针数组的每一个元素大小为4字节。指针数组内的每一个元素都是一个地址,它可以指向存在与内存上的元素。
●指针数组的定义
类型名* 数组名[数组大小]

char* arr[2]={"hello","world"};
//arr即为一个指针数组,它有两个元素,arr[1]指向"hello",arr[2]指向"world"
//如果定义为char arr[2]={"hello","worid"};arr数组内只会将'h''e'存进数组
//其他元素不能存入数组,程序会走向崩溃
char* arr[2];//表示arr有两个char*类型元素
int* arr[2];//表示arr有两个int*类型元素
//...

数组指针

●在C语言中,数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
●数组指针的定义:
类型名 (*p)[数组大小]

char arr[5];//首先定义一个有5个元素的char类型数组
//接下来定义一个数组指针,让它指向上面的这个数组
char (*p)[5];//char [5]是*p所指向内容的类型,即一个有5个元素的char类型数组
//因为要定义的是指针,所以要给p前面加上*,考虑到优先级的关系,要给它加上括号
p=&arr;//p就指向了这个数组
//p+1所指向的地址即为数组最后一个元素的下一个元素的地址

●二维数组指针:

char arr[3][5];//准备好一个二维数组
//定义一个二位数组指针让它指向上面的数组
char (*p)[3][5];//char [3][5]表示这个p指针所指向的内容的类型,
//char (*)[3][5]即为指针p的类型
p=&arr;//p成功指向一个二维数组
//p+1即为这个二维数组最后一个元素后面的位置的地址 

●用一维数组指针来指向二维数组指针

char arr[3][5];//准备一个二维数组
char (*p)[3];//定义一个可以指向三个元素的char类型数组指针
p=&arr;//让p指向上面的数组
//p+1即指向arr[1][0]-arr[1][5],p+1的地址为arr[1][0]的地址
//p+2即指向arr[2][0]-arr[2][5],p+1的地址为arr[2][0]的地址
//...

函数指针

●函数指针是指向函数的指针变量。因此“函数指针”本身首先应该是指针变量,只不过该指针变量指向函数。C语言在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,就可以用该变量调用函数。
●函数指针的作用:调用函数、做函数的参数。
●函数指针的定义:

int Add(int x,int y)//定义一个简单的函数
{
    return x+y;
}
int main()
{
    int (*p)(int, int)=Add;//将Add函数的地址赋给p 
   //int (int, int)是指指针p所指向内容的类型,括号内是函数的参数类型,括号外是函数的返回值类型
   //*表明p是一个指针变量
   int ret = p(2,3);//函数指针的使用,它的返回值5
}

●在函数里,&Add和Add都代表函数的地址。

函数指针数组

●函数指针数组是一个数组,它的每个元素都是函数指针。
●函数指针数组只能存放返回值和参数类型与个数都一致的函数指针。
●函数指针数组的定义:

//定义简单的四个函数用来帮助理解函数指针数组
int Add(int x, int y)
{
    return x+y;
}
int Sub(int x, int y)
{
    return x-y;
}
int Mul(int x, int y)
{
    return x*y;
}
int Div(int x, int y)
{
    return x/y;
}
int main()
{
    int (*arr[4])(int, int)={&Add,&Sub,&Mul,&Div};//将上述4个函数的地址存储与数组arr中
    //数组arr的元素类型为int (*)(int, int)
    return 0;
}

指向函数指针数组的指针

●指向函数指针数组的指针即表示一个指针可以指向一个数组,这个数组的每一个元素都是函数指针。
●经过上面的总结,首先这个数组的元素为函数指针,则应该首先写出它元素的类型,即int ()(int, int)(以上面的函数为例),接下来因为它是一个数组,则类型改变成了int ([4])(int, int)(假设数组有4个元素),要定义一个指针指向这个函数,这里要注意操作符优先级的关系,即int (*(*p)[4])(int, int)(假设p即使要定义的指针)。

int Add(int x, int y)
{
    return x+y;
}
int Sub(int x, int y)
{
    return x-y;
}
int Mul(int x, int y)
{
    return x*y;
}
int Div(int x, int y)
{
    return x/y;
}
int main()
{
    int (*arr[4])(int, int)={&Add,&Sub,&Mul,&Div};
    //数组arr的元素类型为int (*)(int, int)
    int (*(*p)[4])(int, int)=&arr;//定义一个指针p指向这个数组
    //p+1即会跳过整个数组
    return 0;
}

猜你喜欢

转载自blog.csdn.net/h___q/article/details/79878224
今日推荐