arr[i] 等价于 *(arr+i)
使用数组指针接受参数二维数组用,一维数组不建议
首先是一维数组:
void print1 (int(*p)[10],int sz)
{
int i=0;
for(i=0;i
二维数组:
void print1 (int(*p)[5],int c ,int r)
{
int i=0;
for(i=0;i
int* parr1[10]; parr1是一个数组,有10个元素,每个元素的类型是int*
int (*parr2)[10]; parr2是一个指向数组的指针,指向的数组有10个元素,每个元素的类型是int
int (*parr3[10] )[5]: parr3是一个数组,数组有10个元素,每个元素的类型是int(*)[5]是一个数组指针
parr3是一个存放 数组指针 的数组.
去掉数组名和方框剩下的是 数组的元素类型
void test(int*p)
{}
void test2(int **p)
{}
void test3(int(*p)[5])
{}
void test4(int (*p)[3][5] )
int main()
{
int arr[10];
int *arr2[20];
int arr3[3][5];
test(arr);
test2(arr2);
test3(arr3);
test4(&arr3);
return 0;
}
数组名是数组首元素地址(两个例外:sizeof(arr)和&arr这两个表示数组的地址)
函数指针
int Add(int x,int y)
{
return x+y;
}
int main()
{
int (*p)(int,int)=&Add;//不写&也可以 p是函数指针
//函数调用
int ret=Add(2,3);
int ret2=(*pf)(2,3);//pf(2,3)也可
return 0;
}
函数指针数组
int Add(int x.int y)
{
return x+y;
}
int Sub(int x,int y)
{
return x-y;
}
int main()
{
//字符指针数组
char* arr[5];
//整型指针数组
int* arr[5];
//函数指针
int (*p) (int,int);
//返回类型 形参类型
//函数指针数组
int (*p[5])(int.int)={0};
int (*p[5])(int.int)={Add,Sub};
return 0;
]
几个有趣的代码:
void(* signal(int,void(*) (int) ) )(int);//函数声明
//signal函数的参数,第一是int类型,第二个是void(*)(int)的函数指针类型
//其返回值是 void(*)(int)的函数指针类型
typedef void(* pf_t)(int);//给void(*p)(int)函数指针类型重命名为pf_t
pf_t signal(int,pf_t);
void test()
{
printf("hehen");
}
void print_hehe( void(*p)() )
{
if(1)
(*p)();
}
int main()
{
print_hehe(test);
return 0;
}



