C语言函数中的数组传递

用形参返回指针
用函数返回
用全局变量返回
用引用返回C++

#include <stdio.h>
typedef unsigned char uchar;
//---------------------------------------------------全局变量 
uchar *t;
//---------------------------------------------------子函数声明 
void func3(void); 		//利用全局变量返回数组 
void func2(uchar *s); 	//利用指针返回数组 
uchar *func1();			//利用指针函数返回数组 
void func0(uchar *&r);	//利用引用返回数组 
//---------------------------------------------------主函数 
int main(){
	//利用全局变量返回数组 
	printf("利用全局变量返回数组:");
	func3();
	printf("%#.2X %#.2X\n",t[0],t[1]);
	//利用指针作为形参返回数组 
	printf("利用指针形参返回数组:");
	uchar *p;
	func2(p);
	printf("%#.2X %#.2X\n",p[0],p[1]);
	//利用指针函数返回数组
	printf("利用指针函数返回数组:");
	uchar *q;
	q=func1();
	printf("%#.2X %#.2X\n",q[0],q[1]);
	//利用引用返回数组
	printf("利用引用类型返回数组:");
	uchar *r;
	func0(r);
	printf("%#.2X %#.2X\n",r[0],r[1]);
}

//---------------------------------------------------子函数定义 
//利用全局变量返回数组 
void func3(void){
	uchar a[]={0xA5,0xC8,0x1E,0xFF};
	t=a;
}

//利用指针作为形参返回数组 
void func2(uchar *s){
	uchar a[]={0xA5,0xC8,0x1E,0xFF};
	for(int i=0;i<4;i++){
		s[i]=a[i];				//s[i]即*(s+i) 
	}
}

//利用指针函数返回数组 
uchar *func1(){
	uchar a[]={0xA5,0xC8,0x1E,0xFF};
	// 注意可能出现warning: function returns address of local variable,可加上static解决
	// static uchar a[]={0xA5,0xC8,0x1E,0xFF};		
	return a;
}

//C++中利用变量类型引用返回数组
void func0(uchar *&r){
	uchar a[]={0xA5,0xC8,0x1E,0xFF};
	r=a;
} 

在这里插入图片描述

注意:
利用指针函数返回数组时,用指针变量接收返回的数组名(不能用数组名来接收数组名),然后要把指针变量变还原为应该传回的数组再进行调用(若直接调用指针变量,则存在潜在的漏洞:地址复用,容易出现隐藏的bug)。

//利用指针函数返回数组
#include <stdio.h>
typedef unsigned char uchar;
uchar *func1(){
	uchar a[]={0xA5,0xC8,0x1E,0xFF};	
	return a;
}
int main(){
	uchar *pa; 
	uchar a[4];
	pa = func1();			// 指针接收返回的数组名,可以直接调用指针,但存在地址复用的隐藏bug的风险
	for(int i=0;i<4;++i){	// 先将指针转为数组再进行调用
		a[i] = *(pa+i);
	}
	return 0;
}

Primer C++ Page184返回数组指针的函数

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值