【黑马程序员】-c函数
-------<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函数相关推荐
- 黑马程序员——c语言学习心得——函数传递二维数组
黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化. 变量 ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记3】C++核心编程(内存分区模型、引用、函数提高)
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1 内存分区模型 1.1 程序运行前 1.2 程序运行后(手动开辟内存:c语言malloc,c++new) 1.3 new操作 ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记1】数据类型、运算符、程序流程结构、数组、函数、指针、结构体
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.C++初识 1.1 第一个c++程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 ...
- 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数
https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...
- 黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例)
黑马程序员匠心之作|C++教程从0到1入门编程(60 指针-const修饰指针61 指针-指针和数组62 指针-指针和函数63 指针-指针配合数组和函数的案例) 一.60 指针-const修饰指针 二 ...
- 黑马程序员Linux系统开发视频之创建守护进程模型
黑马程序员Linux系统开发视频之创建守护进程模型 1.创建子进程,父进程退出 所有工作在子进程中进行形式上脱离了控制终端 2.在子进程中创建新会话 setsid()函数 使子进程完全独立 ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)
黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...
- 【黑马程序员 C++教程从0到1入门编程】【笔记2】通讯录管理系统
黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难 文章目录 1.系统需求 2.创建项目 2.1 创建项目 3.菜单功能 4.退出功能 5.添加联系人 5.1 设计联系人结构体 5.2 设 ...
- 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
- 黑马程序员C语言基础(第七天)内存管理
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
最新文章
- Spring Boot 为什么这么火?
- Anaconda安装(ubuntu 14.04.03 LTS 64bit)
- FaceBoxes—官方开源CPU实时高精度人脸检测器
- 微信小程序扫码连接WiFi项目, WiFi地推项目(带源码)
- 华为各系列交换机限速配置
- MOS管常用电路分析
- Magicbook 2018开启TPM2.0
- Epicor客制化 - 在VS中进行开发
- IIC扩展IO NCA9555代码
- 利用npn开关电路,将stm32 IO口输出的0-3.3v的pwm波转换为0-5v的pwm波
- 技术晨读_2014_9_1
- 上个厕所的功夫弄清楚了ES搜索服务器
- 移动机器人控制软件的设计与实现
- c语言用键盘弹钢琴,【游戏】用键盘弹钢琴(大家都来试试吧)
- zookeeper客户端使用与集群特性
- 【源码分析】Spring的循环依赖(setter注入、构造器注入、多例、AOP)
- UAV-PPK数据处理软件使用
- java pdf加密文件,java使用itext为pdf文件设置密码保护
- c语言刘备关羽张飞的编程题,《三国演义》经典练习题汇总含参考答案
- 基于龙芯+国产FPGA 的VPX以太网交换板设计(三)
热门文章
- 微信小程序:border属性
- Segger和Micrium之间的区别和联系
- unix下的softlink和hardlink
- 每日学习笔记(21)
- 立帖为据,每日学习一课编程技术
- 三大主流前端框架介绍VUE 、React、Angular
- Ninth season fifth episode,everyone got late at Phoebe‘s birthday dinner??????
- python 显著性检验_Python SciPy 统计显著性检验(Statistical Significance Tests)
- poi导出xlsx文件后,打开报“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决方法
- 计算机多人远程桌面连接,配置网络:实现多个远程桌面连接