数组传参和指针传参
一维数组;
#include<stdio.h>
void test(int arr[])
{
}
void test(int arr[10])
{
}
void test(int* arr)//这里我们传指针也是没有任何问题的,因为arr传过来是指针类型它的类型是int*;
{
}
void test2(int* arr2[20])//arr2是一个指针数组,它的类型是int*类型;
{
}
void test2(int** arr2)//这里使用指针来接收也是对的arr2传过来就是一个指针,再放到我们的二级指针里;
{
}
int main()
{
int arr[10] = { 0 };
int* arr2[20] = { 0 };
test(arr);
test2(arr2);
return 0;
}
二维数组;
void test(int arr[3][5])
{
//这里二维数组传参的时候只可以省略行,但列一定不可以省略;
}
void test(int(*arr)[5])
{
//这里使用指针传参像上面这种方法就是正确的,首先arr是一个指针,然后它对应的是第一行的数组,每个数组有5个元素,每个元素的类型是int
}
int main()
{
int arr[3][5] = { 0 };
test(arr);
return 0;
}
//一级指针传参
void print(int* p, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", *(p + i));
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = &arr;
print(p, sz);
return 0;
}
//二级指针传参;
void test(int** pp)
{
printf("%d ", **pp);
}
int main()
{
int n = 10;
int* p = &n;
int** pp = &p;
test(pp);
return 0;
}
如果函数参数是一个二级指针,那么我们可以传什么样的参数呢?
举个例子:
void test(int** p)
{
}
int main()
{
int* p;
int** pp = &p;
test(&p);//OK
test(pp);//OK
int* arr[10];
test(arr);//OK//指针数组也可以
return 0;
}
数组指针:指向数组的指针;
函数指针:指向函数的指针;
举个例子:
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
/*printf("%d ", Add(a, b));*/
//printf("%p\n", &Add);
//printf("%p", Add);//两个地址一样说明函数名于&函数名都是函数的地址;
int (*pa)(int, int) = Add;//那么再转换成指针就是这种方式;
printf("%d", (*pa)(3, 5));
return 0;
}
再举个例子:
void print(char* str)
{
printf("%s\n", str);
}
int main()
{
void (*p)(char*) = print;
(*p)("hello,bit");
return 0;
}
接下来看两段有意思的代码;
代码1:
(*(void (*)())0)();
解读:把0强制转换为void(*)()-函数指针类型-0就是一个函数的地址;调用0地址处的该函数;
代码2:
void(*single(int, void(*)(int)))(int);
解读:single是一个函数名字,然后它有两个参数,一个为int一个是函数指针,然后single本身也是一个函数指针,它的返回类型是void;
single是一个函数声明
single的函数参数有两个,第一个是int,第二个是函数指针,该函数指针指向的函数参数是int,返回类型是void
single函数的返回类型也是一个函数指针,该函数指针指向的函数参数是int,返回类型是void
简化:
//void(*single(int, void(*)(int)))(int);
//对于以上代码太过复杂不易于看懂,我们可以使用typedef重命名它,这里注意函数指针它与普通的重定义不同;
typedef unsigned int uint;//普通重定义;
typedef void(*pfun_t)(int);//函数指针类型,这里被重定义为pfunt_t,上面的函数就可以被命名为:
pfun_t single(int, pfun_t);