函数形参的传递
来源:互联网 发布:英文原著推荐 知乎 编辑:程序博客网 时间:2024/04/28 12:30
1,传递变量:
2,传递数组:
4,传递结构体与共用体:
结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。
方法一:
使用全局变量:
在keil5.20软件中,结构体全局变量可以这么用:
1,在.h文件中定义结构体类型:(注意是定义了一个新的结构体类型,并没有赋值变量)
struct robotdef{ u8 mode;//ģʽ£ºÊÖ¶¯ ×Ô¶¯ u8 state;//״̬£º´ý»ú Òƶ¯ µ÷Õû Íê³É u8 error;//´íÎó u8 emergency;//½ô¼±Ê¼þ };extern struct robotdef robot;
2,在.c文件中定义结构体变量:(有需要就在.H文件中声明)
struct robotdef robot={0,0,0,0};
3,在函数中调用:
void main(void){ switch(robot.mode) { case 0:{};break; }}
方法二:
结构体指针:
指针也可以指向一个结构体,定义的形式一般为:
struct 结构体名 *变量名;
例如:
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩} stu1 = { "Tom", 12, 18, 'A', 136.5 };//结构体指针struct stu *pstu = &stu1;//结构体变量和数组不同,变量名是一个集合,并不会被编译器编译为一个地址。所以变量名前要加地址符号:&
也可以简写为:
struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;//定义结构体变量时候直接定义指针
获取结构体成员
通过结构体指针可以获取结构体成员,一般形式为:
(*pointer).memberName
或者:
pointer->memberName
第一种写法中,.
的优先级高于*
,(*pointer)
两边的括号不能少。如果去掉括号写作*pointer.memberName
,那么就等效于*(pointer.numberName)
,这样意义就完全不对了。
第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。
上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。
结构体数组指针作为函数参数:
#include <stdio.h>struct stu{ char *name; //姓名,用指针指向字符串,实际使用可以用数组存储名字 int num; //学号 int age; //年龄 char group; //所在小组 float score; //成绩}stus[] = {//结构体数组 {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5}};void average(struct stu *ps, int len);int main(){ int len = sizeof(stus) / sizeof(struct stu); average(stus, len); return 0;}void average(struct stu *ps, int len){ int i, num_140 = 0; float average, sum = 0; for(i=0; i<len; i++){ sum += (ps + i) -> score; if((ps + i)->score < 140) num_140++; } printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);}
5,传递函数:
函数指针:
函数指针的声明方法为:
返回值类型 ( * 指针变量名) ([形参列表]);
注1:“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int func(int x); /* 声明一个函数 */
int (* f) (int x); / * 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
OS_STK *OSTaskStkInit (void (*task)(void *p_arg),\ //指针函数,传递任务函数 void *p_arg,\ //参数,传递任务函数的参数 OS_STK *ptos,\ //栈顶 INT16U opt)\ //选项{ OS_STK *stk; (void)opt; /* 'opt' is not used, prevent warning */ stk = ptos; /* Load stack pointer */ /* Registers stacked as if auto-saved on exception */ *(stk) = (INT32U)0x01000000L; /* xPSR */ *(--stk) = (INT32U)task; /* Entry Point */ *(--stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause fault if ever used)*/ *(--stk) = (INT32U)0x12121212L; /* R12 */ *(--stk) = (INT32U)0x03030303L; /* R3 */ *(--stk) = (INT32U)0x02020202L; /* R2 */ *(--stk) = (INT32U)0x01010101L; /* R1 */ *(--stk) = (INT32U)p_arg; /* R0 : argument */ /* Remaining registers saved on process stack */ *(--stk) = (INT32U)0x11111111L; /* R11 */ *(--stk) = (INT32U)0x10101010L; /* R10 */ *(--stk) = (INT32U)0x09090909L; /* R9 */ *(--stk) = (INT32U)0x08080808L; /* R8 */ *(--stk) = (INT32U)0x07070707L; /* R7 */ *(--stk) = (INT32U)0x06060606L; /* R6 */ *(--stk) = (INT32U)0x05050505L; /* R5 */ *(--stk) = (INT32U)0x04040404L; /* R4 */ return (stk);}
- 函数形参的传递
- 函数的形参传递方式:值传递,指针传递,引用传递的区别
- 函数形参传递
- 指针与引用(函数形参的值传递,引用传递,指针传递)
- c++ 之类成员函数作为函数的形参传递
- 二维数组的作为函数形参的地址传递
- 函数参数的传递(数组形参)
- 函数形参的作用域和传递方向
- C语言-实参到函数形参传递的理解
- 函数实参和形参之间的传递
- 函数的传参方式有值传递和地址传递,地址传递又分为指针传递和引用传递。
- 函数的参数传递
- 函数的参数传递
- 函数指针的传递
- 函数参数的传递
- 函数的参数传递
- 函数参数的传递
- 函数的参数传递
- iOS项目的本地化处理(多国语言)
- Oracle 查询今天、昨日、本周、本月和本季度的所有记录
- DXGI——DirectX Graphics Infrastructure
- Sql Server中查询今天、昨天、本周、上周、本月、上月数据
- 十年了,Hadoop的前世今生
- 函数形参的传递
- js 图片滚动
- 信号与信号量的区别
- 《合成孔径雷达成像——算法与实现》之【8】仿真图3.8
- Android_Service组件详解
- 赛码网常见接受参数的方法
- 数位板的主要参数解析
- Linux下 /proc文件夹内容解析(/proc文件系统解析)
- 使用diskpart