目录
double*p(int)和double(*p)(int)的区别
函数指针:
本身是一个指针,该指针地址指向一个函数
例如:
int add(int x,int y)
{
return x+y;
}
int main()
{
int add(intx,inty);
int*p=&add;
int a=1,b=2,sum=0;
sum=p(a,b);
return 0;
}
double(*p)(int)中的p是指向函数的指针
例如
double fun(int n)
{
int i;
double j,sum=0;
for(i=1;i<=n;i++)
sum+=1/i;
return sum;
}
int main()
{
double fun(int n);
double(*p)(int);
p=&fun;//这里的&可加可不加
print("%d",p(n));
return 0;
}
double*p(int)和double(*p)(int)的区别
()的优先级大于*,所以前者是p(int)这个函数有一个参数,返回double*类型,返回一个double类型。后者是p为指针函数指向一个参数的函数返回的类型为double
二级指针:指向指针的指针
例如
int a=10;
int *p1=&a;
int **p2=&p1;
p1本来就有个地址1,且指向了a的地址2(这里的2个地址不一样)
int**p2=&p1他指向了p1的地址1
打印*p2,因为*p2是一个指针指向的是p1的地址,那么打印*p2就是打印*p2所指向的p1的地址下的内容即a的地址
打印**p2,因为*p2是a的地址,**p2就是取*p2的内容,就是a的地址下的内容即a的值
二维数组
a[3][4];
//第一行是a[0][0] a[0][1] a[0][2] a[0][3]
//第二行是a[1][0] a[1][1] a[1][2] a[1][3]
//第三行是a[2][0] a[2][1] a[2][2] a[2][3]
a[0]的地址为第一行的首元素地址,取其内容就是a[0][0]的值,其余行类同
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
int(*p)[4]=a;
/*(与int *p[4]的区别是:首先()和[ ]的优先级相同都大于*
int*p[3];定义了一个数组,其中的每个元素p[0]、p[1]、p[2]都是指向int变量的指针。
int(*p)[3];定义了一个指针,这个指针是指向一个数组的。)*/
所以就有
数组的指针:
例:
int a[10]={10};
int *p=a;
指针的数组:
数组中所有的元素都有指针
printf("%d",*(*p+0)+0);//就是打印a[0][0]