关于数组指针传参设计的总结

开始学的时候对于数组,指针,函数的一些细节问题不是那么明白,整理了一下;

指针数组

顾名思义指针数组是个数组,是存放指针的数组;例如:int *arr[5]   指针数组arr是有5个元素,每个元素是int*;  同理 char *arr[5]   指针数组arr是有5个元素,每个元素是char*;

 数组指针

数组指针是指向数组的指针。例如:int (*arr)[5]  意思是arr指针指向一个数组,该数组含有5个元素,每个元素都是int,    char* (*per)[5]意思是per指针指向一个数组,该数组含有5个元素,每个元素都是char*;

方括号和解引用符号功能是一样的,用数组指针来表示图中a[2][3]的值——(*(arr+2))[3]、还能写成   *((*(arr+2))+3);

一维数组传参

int main()
{
    int arr[3];
    test(arr);//arr是一维数组首元素地址
}

函数形参该拿什么接收?

//1.
void test(int arr[3])
{}

//2.
void test(int arr[])//其实2和1是属于一种,方括号里可以写数字也可以不写
{}

//3.
void test(int* arr)//实参穿的地址,拿一级指针来接收
{}

二维数组传参

int main()
{
    int arr[3][5]={0};
    test(arr);//传的是第一排的地址 &arr[0]
}

函数形参该拿什么接收?

 

//1.
void test(int arr[3][5])
{}

//2.
void test(int arr[][5])//第一个变量可以不可,第二个变量必须写
{}

//3.
void test(int (*arr)[5])//3*5的二维数组,当成3个一维数组,拿数组指针来接收
{}

当函数形参为一级指针时

函数是:void test(int *p){},

int main()
{
	int a = 10;
	int *p1 = &a;
	int arr[10] = { 0 };

	//以下可以使用
	test(&a);
	test(p1);
	test(arr);
}

当函数形参为二级指针时

函数是:void test(int **p){},

int main()
{
	int a = 10;
	int* pa = &a;
	int **ppa = &pa;
	int *arr[5];

	//以下可以使用
	test(ppa);
	test(&pa);
	test(arr);
}

函数指针

函数指针是指向函数的指针

 函数地址不存在首地址一说,函数指针变量和数组指针变量差不多;

分别用函数名,函数指针变量调用函数的形式: 

 

例题1:分析 (*( void (*)() ) 0)() 这个代码什么意思;(此题来源于《C陷阱与缺陷》)

 

         这个题就说明了函数指针的用途,有人说有函数名可以直接调用为什么还那么麻烦使用函数指针变量;函数指针变量就用于不知道函数名的情况,就是说函数指针变量调用指定地址的函数;把0用(函数指针变量)强制转化成函数的地址,再进行调用;

(注意:在当前操作系统上,0地址不允许被访问,在允许访问的基础下,只能用上面那个)

 例题2:分析 void (* signal (int, void(*)(int) ) )(int) 这个代码什么意思;

 总结:在分析此类问题时,从函数定义函数声明函数调用三方面考虑!

 

 

 

  • 16
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值