函数形参的传递

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值