-------<a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流! ----------

本文主要介绍了c语言中常用到的一些知识,主要由结构体、枚举以及函数。一下的内容都是个人的理解,如果有不对的地方,还希望大家能够指正,谢谢!

一、结构体

结构体和数组有许多相似的地方,比如两者都能存储许多数据。但是两者最大的区别就是:结构体可以存储不同类型的数据,数组之只能存储相同类型的数据。

(1)定义方式:

struct     结构体名称

{

int    变量1;

double 变量2;

float 变量3;

char 变量4;

};

以上的定义形式可以说明,在结构体中可以存在许多不同的类型变量,这一点很好的解决了在使用过程中的许多问题。例如定义一个人,人有很多属性,人得姓名、年龄、身高、体重等都可以在一个结构体中包含。一面给出了一个结构体的例子:

#include <stdio.h>int main()
{
<span style="font-size:12px;"></span><pre name="code" class="cpp">    //定义一个结构体struct Person{ int age;double height;char name;};

//结构体初始化 struct Person p = {12, 32.1, 'j'}; //定义是就初始化 struct Person p1; //定义完之后再初始化 p1.age = 20; p1.height = 12.2; printf("age = %d, height = %f", p.age, p.height); return 0;} (2)内存分析

结构体在定义时是不会分配内存空间的,只有在定义变量的时候才真正的分配空间。

(3)结构体中的补齐算法

程序例子为:

#include <stdio.h>int main()
{//定义一个结构体,结构体的内存是内部成员变量占字节最大的值的倍数struct Student{//三个成员变量所占字节总和为20字节。int age; //占用4个字节double height;  //占用8个字节char *name;  //占用8个字节};//结构体初始化struct Student stu = {12, 32.1, "jack"}; //定义是就初始化int s = sizeof(stu);  //计算stu所占用的字节数,由于结构体内最大为8,因此理论上应该是8的倍数。printf("%d\n", s); //输出是24,为8的3倍。printf("age = %d, height = %f\n", stu.age, stu.height);return 0;
}

(4)结构体也可以利用指针来进行操作

定义:struct 结构体名称   *变量名称;

例如上一个程序中的stu,可以这样操作:

struct   student   *p;

p = &stu;

那么(*p)age,(*p)height就表示结构体中的成员变量,也可以表示为p->age和p->height都是一样的效果。

二、枚举

枚举可以限定一个变量的所有可能取到的值,而对于不包含在声明里的数据,不能取到。

(1)枚举定义类型为:

enum  枚举名称

{

成员变量,//注意枚举的变量之间使用“,”隔开。

...

};

(2)默认情况下,枚举的成员变量的编号是从0开始计算的。也可以通过更改成员变量的编号。例如更改首个成员变量的编号为1,那么接下来的成员变量会从2开始,逐个编号。

三、预处理指令

预处理指令都是以“#”开头。预处理指令在代码翻译成0和1之前执行,位置可以随便写,作用域是从编写指令行开始的。

预处理指令包括宏定义、条件编译和文件包含。

1、宏定义:   #define     宏名(一般大写)   值

宏定义的应用效率要比函数高,因此在一些简单的计算中,能用宏定义解决的就不用函数来计算。带参数的宏定义:

#include <stdio.h>//定义一个宏,让sum(a,b)取代((a)+(b))的功能。
#define sum(a, b) ((a)+(b))int main()
{//宏定义的应用int a = 12;int b = 11;int sum = sum(a, b); //利用宏定义计算连个数的和printf("%d+%d=%d\n", a, b, sum); //输出结果return 0;
}

2、条件编译

条件编译的形式一般有以下几种:

1> #if  条件1

......

#else

......

#endif

2>#if  条件1

......

#elif  条件2

......

#endif

3>#if  defined(...)

......

#else

......

#endif

使用注意:在条件编译中不能使用主函数中变量,因为条件编译会在编译时运行,而此时主函数并没有运行,所以主函数中的变量都是不存在的,因此无法使用。一般只能利用宏定义的值。

3、条件包含

条件包含的主要目的就是防止循环包含,使.h文件中只包含一次某个头文件,这就大大提高了代码的效率。

一般的书写形式为:

#ifndef   ABC

define   ABC   1

......

#endif

四、typedef关键字

tepydef关键字就是给一个成员起别名。

#include <stdio.h>
void hong();typedef int MyInt; //取代整型typedef struct Student MyStu;  //取代结构体struct Student{int age;double height;
};typedef struct Person{char *name;int age;
} MyPer;  //取代结构体typedef enum sex{sexMan,sexWoman
} MySex;  //取代枚举typedef void(*MyPoint)();int main()
{MyInt a = 10;  //相当于 int a = 10;MyStu stu1;  // ==struct Student stu1MyPer per;MySex sex = sexMan;MyPoint *p1 = hong; //相当于void (*p)() = hong;return 0;
}

五、static与局部变量

1、对于函数来说,在默认情况下,所有的函数都是外部函数,所以可以省略extern。当要声明一个内部函数的时候,可以在开始出加上static来修饰。加上static之后,允许不同文件中有同名的内部函数。

在默认情况下,变量用完就会消失。利用static修饰之后,函数用完后并不消失,仍继续存在。也就是说static会延长修饰内容的生命周期,直到程序结束。例如:

#include <stdio.h>void test()
{int a = 0; //定义变量a++;printf("%d\n", a);static int b = 0; //定义static变量b++;printf("%d\n",b);
}int main()
{test();  //输出为 1,1test();  //输出为1 ,2return 0;
}

六。递归

设计一个函数,用来计算b的n次方。

#include <stdio.h>int pow2(int a, int n)
{//递归常用的方法if (n == 0) {return 1;}return pow2(a, n-1)*a;
}int main()
{int b = 3;int n = 4;int pow = pow2(b, n); //调用递归函数printf("%d的%d次方为:%d\n", b, n, pow);return 0;
}

-------<a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流! ----------

【黑马程序员】-c函数相关推荐

  1. 黑马程序员——c语言学习心得——函数传递二维数组

    黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.    变量 ...

  2. 【黑马程序员 C++教程从0到1入门编程】【笔记3】C++核心编程(内存分区模型、引用、函数提高)

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1 内存分区模型 1.1 程序运行前 1.2 程序运行后(手动开辟内存:c语言malloc,c++new) 1.3 new操作 ...

  3. 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...

  4. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

  5. 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)

    黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例) 一.60 指针-const修饰指针 二 ...

  6. 黑马程序员Linux系统开发视频之创建守护进程模型

    黑马程序员Linux系统开发视频之创建守护进程模型 1.创建子进程,父进程退出   所有工作在子进程中进行形式上脱离了控制终端 2.在子进程中创建新会话   setsid()函数   使子进程完全独立 ...

  7. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  8. 【黑马程序员 C++教程从0到1入门编程】【笔记2】通讯录管理系统

    黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.系统需求 2.创建项目 2.1 创建项目 3.菜单功能 4.退出功能 5.添加联系人 5.1 设计联系人结构体 5.2 设 ...

  9. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  10. 黑马程序员C语言基础(第七天)内存管理

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

最新文章

  1. Spring Boot 为什么这么火?
  2. Anaconda安装(ubuntu 14.04.03 LTS 64bit)
  3. FaceBoxes—官方开源CPU实时高精度人脸检测器
  4. 微信小程序扫码连接WiFi项目, WiFi地推项目(带源码)
  5. 华为各系列交换机限速配置
  6. MOS管常用电路分析
  7. Magicbook 2018开启TPM2.0
  8. Epicor客制化 - 在VS中进行开发
  9. IIC扩展IO NCA9555代码
  10. 利用npn开关电路,将stm32 IO口输出的0-3.3v的pwm波转换为0-5v的pwm波
  11. 技术晨读_2014_9_1
  12. 上个厕所的功夫弄清楚了ES搜索服务器
  13. 移动机器人控制软件的设计与实现
  14. c语言用键盘弹钢琴,【游戏】用键盘弹钢琴(大家都来试试吧)
  15. zookeeper客户端使用与集群特性
  16. 【源码分析】Spring的循环依赖(setter注入、构造器注入、多例、AOP)
  17. UAV-PPK数据处理软件使用
  18. java pdf加密文件,java使用itext为pdf文件设置密码保护
  19. c语言刘备关羽张飞的编程题,《三国演义》经典练习题汇总含参考答案
  20. 基于龙芯+国产FPGA 的VPX以太网交换板设计(三)

热门文章

  1. 微信小程序:border属性
  2. Segger和Micrium之间的区别和联系
  3. unix下的softlink和hardlink
  4. 每日学习笔记(21)
  5. 立帖为据,每日学习一课编程技术
  6. 三大主流前端框架介绍VUE 、React、Angular
  7. Ninth season fifth episode,everyone got late at Phoebe‘s birthday dinner??????
  8. python 显著性检验_Python SciPy 统计显著性检验(Statistical Significance Tests)
  9. poi导出xlsx文件后,打开报“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决方法
  10. 计算机多人远程桌面连接,配置网络:实现多个远程桌面连接