函数形参的传递

来源:互联网 发布:英文原著推荐 知乎 编辑:程序博客网 时间: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);}
0 0
原创粉丝点击