1,数组指针与指针数组
数组指针
数组指针实质上还是指针,不同之处在于它是指向数组的,多用于二维数组
如下例,int (p) [3]就是一个数组指针,可以指向第二维维度为3的二维数组,并给出了两种同样功能的初始化方式;p++后,则由arr[0]变为指向arr[1];同时,二维数组解引用时需要 ’ * * ’
#include <stdio.h>
int main()
{
int arr[2][3] = {{1,3,5},{2,4,6}};
// int (*p)[3] = &arr[0];
int (*p)[3];
p = arr;
printf("*p = %d.\n",*(*p));
p++;
printf("*p = %d.\n",**p);
return 0;
}
指针数组
指针数组,比如int *p [3] 实质上就是定义了三个指针,分别为p[0],p[1],p[2],可以将它们拿来单独使用
如下例:
#include <stdio.h>
int main()
{
int i=0;
int arr[3]= {1,3,5};
int *p[3] ;
p[1] = &arr[0];
p[2] = &arr[1];
p[3] = &arr[2];
for (i=1; i<4; i++)
printf("p[%d] = %d\n",i,*p[i]);
return 0;
}
指针函数与函数指针
指针函数
本质是一个函数,它的返回值类型是一个指针
如下例:
#include <stdio.h>
int* fun(int *a)
{
return a;
}
int main(void)
{
int a = 3;
printf("%d", *(fun(&a)));
return 0;
}
函数指针
本质是一个指针,这个指针指向的是一个函数
#include <stdio.h>
//比较两个数的大小
int func (int a,int b)
{
if (a<b)
return b;
else
return a;
}
int main (void)
{
int (*p)(int,int); //定义了一个函数指针
p = &func; //指向函数
int a;
a = (*p)(2,8); //调用函数
printf("较大的数是 %d\n",a);
return 0;
}
其中,定义函数指针时,要注意类型与函数的类型一定要匹配,比如上例,函数是int func (int a,int b),其中,func是函数名,int (int a,int b)是函数的类型名;所以定义指向它的指针时,类型名要一致,也是int (int a,int b),(*p)将p定义为一个指针,根据C语法规则,写为int ( *p) (int a,int b),其中,a,b为形参,不写也可以。