学到指针,笔者发现在C语言里面有很多名字会让人摸不着头脑,比如“指针数组”“数组指针”“指针函数”“函数指针”“函数指针数组”......这些名字会让人觉得头大。那么他们到底是怎么个事呢?接下来让我分别给大家解释一下。
1.指针数组
指针数组的一般形式是:数组变量类型+数组名+[ ],比如 :
int* arr[10];
在这里怎样理解它呢?首先,我们看到了一个变量名“arr”,由于“[ ]”的优先级是大于“*”的,所以“arr”先和“[ ]”结合,变成了一个数组,于是“*”就会和“int”结合。整体理解起来就是“定义了一个数组,里面有十个元素,每个元素的类型是‘int*’型”。那么这个数组的作用就是用来存放类型是“int*”型指针的。
2.数组指针
数组指针的一般形式是:变量类型+ (*变量名)+[ ],比如:
int (*arr)[10];
在这里,我们可以看到它和指针数组在格式上的区别是在“*”和变量名两边加上了“()”,在这里这个括号的作用是改变优先级,由于“()”和“[ ]”的优先级属于同一级,且结合方向是从左到右,那么“arr”就应该和“*”结合,代表这是一个指针变量,然后再理解“[10]”代表“arr”指向一个数组。整体理解起来就是“定义一个指针变量,它指向一个数组大小为10的数组,这个数组里面每个元素的类型都是‘int’型”。不过要注意的是这个指针储存的是整个数组的地址,那么指针+1或者-1,指针移动的大小是sizeof(数组元素类型)*数组元素的数量。
3指针函数
指针函数的一般形式是:函数返回值类型+ * +函数名+()比如:
int *arr()
{
//函数体
return &
}
在这里,同样是“()”先和函数名“arr”结合,代表这是一个函数,“*”和“int”结合,代表返回值类型是“int*”即返回一个地址。在这里需要注意的是不要返回本函数里面变量的地址,因为函数在结束调用之后会将内存归还给系统,如果被接受返回值之后,那么他指向的是已销毁的地址,他就变成了“野指针”,这是很危险的。
4函数指针
函数指针的一般类型是:函数返回值类型+(*变量名)+(函数参数类型)。比如:
int Add(int num1,int num2)
{
return num1+mun2;
}
int (*arr)(int,int)=Add;//或者int (*arr)(int,int)=&Add;
同样的理解:“*”先和arr结合,说明arr是一个指针变量,它指向一个有两个“int”类型形参,并且返回值类型是“int”型的函数。因为函数名就是地址,所以在使用的时候,函数名使用“&”和不使用“&”的效果一样。
5函数指针数组
函数指针数组一般形式是:函数指针指向的函数返回值类型+(*数组名[元素数量])(函数指针指向的函数形式参数类型),比如:
int (*arr[10])(int,int);
这里arr先和“[ ]”结合,代表arr是一个数组,可以储存10个指向有两个“int”型的形式参数,且返回值类型是“int”型的函数的地址。使用方法同普通数组,它可以实现转移表的功能。
理解这些知识需要知道各个符号的优先级和结合性,更多的是动手操作,让知识牢记于心
如果有误,欢迎斧正