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);
}