1.数组与函数

1) 数组元素作参数

large(int x, int y){...};

large(a[2], a[3]);

1) 数组名作参数

计算数组中用户6个月的积分平均值

float aver(float b[6]) {....}

float a[6]...;

av = aver( a );

a. 数组名作函数参数,两个数组分别定义。

b. 实参数组和形参数组类型保持一致。

c. 形参数组大小不起任何作用,因为C语言不对形参数组大小作检查,只是将实参数组的地址传递给了形参数组名,即在空间上为形参数组分配了一个指针大小空间。形参数组和实参数组共用存储单元,a[2]和b[2]指的同一个元素。

数组形式:double  fun(double b[5]);

地址形式:double  fun(double *b );

d. 形参数组可以不指定大小,定义时保留空方括号即可。

float aver(float b[]);

e. 实参数组大小可以用另一个形参进行传递。

float  aver(float b[],  int n);

2) 多维数组名作参数

a. 函数调用时只需要传递数组名。

b. 形参数组的一维可以省略,括号不可以省略。二维不可省略,因为二维数组在内存中是按照行存放的,必须指定列数。

int  array[3][10]

int  array[ ][10]

c. C语言不检查第一维大小,在第二维数组相同的情况下,形参一维可以与实参大小不同。

实参: int  marks[5][10];

形参: int  array[2][10];

练习:对二维数组a[4][3]分析,求出最大值。

2.指针函数

整型函数是返回一个整型值的函数;

指针函数是返回一个地址(指针)值的函数。

1) 定义形式:

<数据类型>  *<函数名称>  (<参数说明>)  {...}

char  *mystring (void)  {}

int  * fun(int x, int y);

函数名先和优先级高的()结合组成函数。

3.函数指针

函数地址是函数的入口地址。函数指针变量是用来存放函数地址的指针变量。

函数名代表函数的地址。

PS:

函数可以通过函数名(表示函数地址)调用;也可以通过函数指针调用。

当一个整型指针指向一个整型变量,则可以通过指针去访问整型变量;

当一个函数指针指向一个函数,则可以通过这个指针调用函数。

1) 函数指针形式:

<数据类型>  (*<函数指针名>)  (<参数列表>);

数据类型是其指向函数的返回值类型。

int  (*p)(int x,  int y);

p先和* 结合,组成指针变量,然后和()结合组成指向函数的指针变量,p指向函数入口处,不能指向函数中的某一条指令,不能用*(p+1)表示函数下一条指令。

3) 函数指针的赋值:

p = max; //直接给出函数名,不用给出参数。(因为是把函数地址赋值给p,与参数无关)。

4) 函数指针调用函数:

调用时,用(*p)代替函数即可,且要在(*p)加上实参。

c = max(a, b);

c = (*p)(a, b);

Ps:

函数指针指向函数入口地址,p+n, p++,p--等没有意义。

5) 函数指针作为函数参数

void sub(int (*x1)(int), int (*x2)(int , int ))

{

int a, b, i, j;

a = (*x1)(i);

b = (*x2)(j);

}

4.函数指针数组

函数指针数组是包含多个函数地址的数组;

1) 定义形式:

<数据类型>  (*<函数指针数组名> [<大小>])  (<参数列表>);

int  (*pFunc[2]) (int a, int b);

6) 赋值:

pFunc[1] = fun1;

pFunc[2] = fun2;

7) 调用:

a = (*pFunc[i])(6, 7)

一、结构体

结构体是数据类型

数据类型可以分为系统定义的类型(int/char/float...)和用户定义类型。

当多个信息由不同的类型组合在一起的来描述一个事物的时候,开发者会根据自己的要求构造一个数据类型----结构体(structure)/结构。

结构体是用户自己定义的一种数据类型。

5.定义结构体

struct  结构体名 //用户自己决定类型名

{

.......//成员列表

;  //用分号 ;作为结束符,且不能省略。

Ø 结构体类型是用户自定义的一种数据类型。

Ø 由不同基本数据类型的数据构成。

Ø 定义类型不分配空间,声明变量才分配空间。

6.结构体类型变量定义

定义一个变量,先要有数据类型,然后再定义变量

定义结构体类型的变量有三种方式:

① 先定义结构体类型,再定义

struct  结构体名/数据类型名 struct  Mytype

{ {

成员列表; int id;  char  name[N]; char sex;

} ; } ;

struct  结构体名   变量名; struct  Mytype   man1, man2;

man1和man2是变量,它们的类型是 struct  Mytype 类型。

//Mac头部,总长度14字节   TCP/IP协议头部结构体

typedef struct _eth_hdr

{

unsigned char dstmac[6]; //目标mac地址

unsigned char srcmac[6]; //源mac地址

unsigned short eth_type; //以太网类型

}eth_hdr;

技巧1:

#define   MYTYPE   stuct Mytype.

MYTYPE  man1, man2;

技巧2:

typedef  struct   student

{  char   name[10] ;

int   age ;

int   s1, s2 ;

} SD;

SD   st1, st2;//书写简单,  移植性增强

② 定义类型同时定义变量

struct  结构体名

{

成员列表;

} 变量名;

③ 直接定义结构体变量

struct

{

成员列表;

}变量名;

7.引用、初始化、赋值

1) 引用

 结构体变量名.成员名 //“ . ”是分量运算符(成员运算符),优先级最高。

Ø 直接引用单个成员student1.id = 121; //不能整体引用。

Ø 成员又是一个结构体类型

student2.birthday.month

Ø 成员可以同普通变量一样进行运算。

student2.age++;//age先和studen2结合。

Ø 可以引用 结构体变量成员 地址,也可以引用 结构体变量 地址。但不能整体引用结构体变量。

scanf(“%d”, &student2.id);

printf(“%p”, &student2);

scanf(“%d,%s,%f,%s...”, &student1);

8) 初始化

定义同时初始化

9) 赋值

相同结构体类型的结构体变量可以相互赋值,不同类型不可以。(数组完全不可以相互赋值)。

8.结构体的大小

9.结构体数组

具有相同结构体类型的结构体变量组成的数组。

定义:和结构体变量定义方法相仿,要说明是数组。

(旧标准中只能对全局和静态存储类别结构体初始化)。

成员引用:stu[1].name

相同类型的结构体可以相互赋值,结构体数组元素可以直接对同类型元素赋值。

同样不能对整个结构体操作。

举例:

10.结构体指针

指向结构体变量的指针变量称为结构体指针。

定义形式:

struct 结构体名 *结构体变量名

struct storage   *p; //系统为指针本身分配内存空间。

成员引用:

struct message

{

uint8_t type;   //数据类型

uint8_t slave_address;

uint8_t machine_num;

}infor1;

struce message  *p = &infor1;

(*p).type = char  //每次使用括号为编写带来不便,C给出了另一种方法:

p->type。-> 为指向运算符。 和分量运算符 . 拥有较高的优先级。

小结:

结构体成员引用方式:

stu.name

(*p).name

p->name //p为结构体指针变量。

struct  usr

{

char  name[10];

int num;   flaot  score;

};

struct usr  staff[100], *p;

p = staff;

p++或p = staff+1指向哪里?

11.结构体变量作参数

返回结构体类型值的函数

结构体类型名 函数名(形参...){...}

struct staff func(int x, char name[N]){...};

举例:求学生成绩总分和平均分(分别用结构体变量作为参数和结构体指针做参数)<结构体作参数.c>

二、共用体  

不同数据类型使用同一段空间的构造类型称为共用体。(省空间)

共用体(union)在定义、说明和使用形式和结构体相似。

union foo

{

int i;

char c;

};

i = 5;

c = ‘a’;

printf(“%d %c”, i, c);

① union用同一个内存空间存储不同数据类型,即不能同时存下每个成员的数据,同时只有一个成员。

② union变量中的数据时最后一次存放进去的数据,之前的数据会失去作用。

③ union变量地址和其他成员的地址是同一地址

不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,并且,不能在定义共用体变量时对它进行初始化(可以, 仅仅对第一个成员初始化,后面的成员会覆盖前面的数据)。共用体变量的初始化[1]  。

(1)union data a=b; //把共用体变量初始化为另一个共用体

(2)union data a={123}; //初始化共用体为第一个成员

(3)union data a={.ch='a'}; //指定初始化项目,按照C99标准

与结构体的比较:

存储空间的区别

结构体变量可以作为函数参数,函数也可返回一个结构体指针变量。联合体不可以作为函数参数。

例1:

a的大小为结构体大小,x,y,z分别为4,5,6. 对k赋值,k要共享内存,union从首地址开始存放数据,x的位置。

《格列佛游记》中把人类按照敲鸡蛋的方向分为两类人,计算机在数据存储的时候也有两种存储机制,分别为大小端。

编写代码测试系统大小端

<Endianness.c>

函数、指针、数组的组合 及结构体和共用体相关推荐

  1. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  2. 指针数组,数组指针,函数指针,函数指针数组 ,指向函数指针数组的指针

    首先有个问题:指针和数组有什么关系呢? 答案:什么关系都没有. 指针就是指针,在32位平台下,永远占4个字节,其值为某一个内存的地址. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其 ...

  3. C语言回炉重造(枚举,指针,结构体,共用体,位域)

    枚举 enum 概念为,当有一系列变量需要规则性赋值是,可以使用enum作为一个特殊的数据类型. 例如:需要给7个不同的变量分别赋值1到7(mon,tue,wed,thu,fri,sat,sun) 在 ...

  4. C语言基础10——指针进阶。字符指针、指针数组、数组指针、函数指针、函数指针数组、回调函数、数组名详解、杨氏矩阵、字符串旋转

    目录 字符指针 指针数组 数组指针 数组传参.指针参数 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 练习 数组名的意义 指针笔试题 字符指针 字符指针的另一种使用方式 #include ...

  5. c语言--函数指针数组

    c语言–函数指针数组 1.指针数组的概念 本质是数组,数组的每一个元素是一个指针变量: 2.指针数组的定义方法 类型说明符 *数组名[元素个数] void test() {int a=10,b=20, ...

  6. 函数指针数组在ARM异常中断处理中的应用

    介绍一种简洁.高效.灵活的ARM异常中断处理方法.       在ARM中,由于所有的中断都使用同一个异常中断入口地址,即0x00000018.因此需要在异常中断处理程序中根据相应的中断号调用对应的中 ...

  7. C++ 类成员函数指针数组应用(一)

    前言 阅读本文之前你需要明确知道函数指针和普通函数的区别,对这两者本文不做过多说明 目标 使用函数指针数组建立一套bpm工作流框架.这套框架在各种oa以及某几个大型通信公司应用的很广泛 适应场景 多分 ...

  8. C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)

    文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...

  9. 指针数组,数组指针,函数指针、指针函数、函数指针数组

    曾经的我是一个摆男,一言不合就开摆,直到我遇见了电子厂....发生了一些不可描述的事,让我看清了社会的真相...  进入正题! 分析时的两个步骤:是什么?怎么用? 是什么? 1.指针数组:本质是数组, ...

最新文章

  1. 电信业务支撑报表开发工具解决方案
  2. LINUX内核经典面试题30道及解答
  3. 检验是否服从同一分布
  4. QML基础类型之quaternion
  5. 给Ubuntu 16.04更换更新源
  6. sql查询成绩最高分_sql查询各科成绩前三名----详述过程,思路清晰不烧脑!
  7. 看完这篇你就知道什么是无服务器架构了
  8. 线性结构 —— 前缀和
  9. react前端封装接口弹出错误_react+ts打包发布后报Minified React error ..这种错误
  10. Unity 边缘发光HighlightingSystem的使用
  11. java .jar怎么打开_详解jar文件怎么打开
  12. ubuntu下终于安装好了nvidia的gt540显卡驱动
  13. TiDB at 丰巢:尝鲜分布式数据库
  14. 经常写大材料的请惠存(转载)
  15. Hyper Text Markup Language 超文本标记语言
  16. 经典linux c程序,经典 c 程序 100 例
  17. 品优购注册页html
  18. python 结束 serve_forever_如何使用Python脚本启动和停止包含“http.server.serveforever”的Python脚本...
  19. 织梦Dedecms制作"关于我们"等单页面的实现方法
  20. 分布式事务详解(看完不懂我当场认做你哥)

热门文章

  1. 在.Net 模板页中使用CSS样式
  2. java 8 lambda sort_Java8 用Lambda表达式给List集合排序的实现|chu
  3. gin context和官方context_Gin框架系列01:极速上手
  4. axure类型app项目rp文件_Python编程快速上手实践项目--选择性拷贝指定类型文件到目的目录...
  5. 九度互动社区IT名企招聘上机考试热身赛
  6. NetworkComms V3 之支持TCP连接和UDP连接
  7. NSArray打印汉字的方法
  8. oracle中文乱码问题
  9. 在linux中安装.sh 文件
  10. Redis:安装、配置、操作和简单代码实例(C语言Client端)[转]