用数组名作为函数参数

1、用数组名作为函数参数

1.1 实参与形参概念

  1. 比如你定义一个函数void add(int a, int b),这里的a和b就是形参。
  2. 当你进行函数调用的时候,add(1, 2),这里的1和2就是实参。

1.2 形参是数组 实参应该是什么?

如果形参是数组,那么实参是数组对象. 例如: void fun(int a[],int count); 参数一:表示的是int 型数组
参数二:表示传入的数组的个数 调用函数: int a[3] = {1,0,1}; fun(a,3) 这个时候 a 就是数组对象 重点:
数组对象和指针确实在某些时候能够相互转换,但是他们两个是不相同的两个概念

f(int arr[],int n)
但是编译时是将arr按指针变量处理的,相当于将函数f的首部写成
f(int*arr,int n)
以上两种都是等价的

1.3 小结

  C语言调用函数时虚实结合的用法都是采用“值传递”方式,当用变量名作为函数参数时,传递的是变量的值,当用数组名作为函数的参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量。

2、结构体指针:

2.1 结构体定义

  下面代码解释为:关键字是struct它表明跟在后面的是一个结构,后面student表示一个标记,可以用这个标记来引用这种结构,struct student student1;student1使我们创建的一个结构体变量,该变量的结构布局是student

struct student{
    
    
	int num;
	char name[20];
	char sex;
	int age;
	float score;
	char addr[30];
}

2.2 为结构体声明定义别名

  可以采用typedef 为复杂的声明定义简单的别名,简单写法可以不写student,在struct前面加上typedef 于是定义结构变量就可以写成:Stu student1;

typedef struct
{
    
    
   int no;
   char name[12];
}Stu;
Stu student1;
//定义结构指针可以写成:
Stu *student1;

2.3 结构体指针

  下面代码中cjq_event_record是结构体指针,给结构体指针赋地址可直接通过结构体指针访问该地址对应的内存

typedef struct
{
    
    
	INT32U event_idx[MAX_CJQ_EVENT_NUM];
	INT8U event_start_time[MAX_CJQ_EVENT_NUM][6];//YYMMDDHHMMSS反过来存
	INT8U event_end_time[MAX_CJQ_EVENT_NUM][6];

	CJQ_ENENT_VALUE event_value[MAX_CJQ_EVENT_NUM];     //超限值
	INT8U event_happend;    //发生标志
}CJQ_ENENT_RECORD_UNIT;//事件记录结构体  

CJQ_ENENT_RECORD_UNIT *cjq_event_record = NULL; 
CJQ_ENENT_RECORD_UNIT cjq_temp_event_record[MAX_SENSOR_NUM];
CJQ_EVENT_newest_idx[CJQ_EVENT_3E10] = sensor_idx;//记录序号
//给结构体指针赋地址,一个类型为T的指针移动,是以sizeof(T)为移动单位。
cjq_event_record = cjq_temp_event_record + CJQ_EVENT_newest_idx[CJQ_EVENT_3E10];
//通过结构指针读取对应内存
cjq_event_record->event_idx[0];//	通过结构体指针,提取内存

猜你喜欢

转载自blog.csdn.net/luopeng12345/article/details/110557318