浅谈指针进阶——数组参数、指针参数和函数指针

数组参数

一维数组传参

void test(int arr[]){}//ok
//void test(int arr[10]){}//ok
//void test(int *arr){}//ok
void test2(int *arr[20]){}//ok
//void test2(int **arr){}//ok

int main()
{
	int arr[10] = { 0 };
	int *arr2[20] = { 0 };
	test(arr);
	test2(arr2);
	return 0;
}

二维数组传参

//void test(int arr[3][5]){}//ok
//void test(int arr[][]){}//错误
//void test(int arr[][5]){}//ok

//void test(int *arr){}
//void test(int *arr[5]){}
//void test(int (*arr)[5]){}
//void test(int **arr){}

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\n", *(p + i));
	}
}
int main()
{
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int *p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//一级指针p,传给函数
	print(p, sz);
	return 0;
}

二级指针传参

void test(int** ptr)
{
	printf("num = %d\n", **ptr);
}

int main()
{
	int n = 10;
	int* p = &n;
	int **pp = &p;
	test(pp);
	test(&p);

	return 0;
}

函数指针

void test()
{
	printf("hehe\n");
}

int main()
{
	printf("%p\n", test);
	printf("%p\n", &test);
	return 0;
}

void test()
{
	printf("hehe\n");
}

int main()
{
	//下面那个有能力存放test函数的地址
	//第一个可以
	void(*pfun1)();
	//void *pfun2();

	return 0;
}

//代码1 
(*(void (*)())0)();
//代码2
void(*signal(int, void(*)(int)))(int);

猜你喜欢

转载自blog.csdn.net/weixin_43580319/article/details/111826121