// 三元运算符
// 获取两者之间的较大值
// int a = 10;
// int b = 20;
// int c = a > b ? a : b;
// printf(“%d\n”, c);
// 获取三者之间的最大值
// int d = 5;
// printf("%d\n", c > d ? c : d);
/*
逗号运算符的规则
1.从左到右
2.最后一个子表达式的结果是整个表达式的结果
3.优先级最低(永远是最后执行的)
*/
/*
数组:若干个相同类型的变量在内存中有序存储集合
int a[10];
数组下标从0开始
char s[10];
指针数组
char *a[10];
int *a[10];
结构体数组
struct stu boy[10]
一维数组
int a[10];
int a[10][20];
定义一个数组在内存中分配空间
在数组定义的时候可以不给出数组元素的个数,根据初始化的个数来决定数组的大小
int a[]={1,2,3};
二维数组在定义的时候可以不给出行数但是必须给出列数,二维数组的大小根据初始化的行数来定
int a[][3]={
{1,2,3}
{4,5,6}
{7,8,9}
定义数组的时候,顺便给数组的元素赋初值,即开辟空间的同时并且给数组元素赋值
注意:只能省略后面元素,可以不初始化,不能中间不初始化
int a[5]={1,2,3}后面不足的元素补0
}
函数是c语言的功能单位,实现一个功能可以封装一个函数来实现
定义函数的时候一切以功能为目的,根据功能去定义函数的参数和返回值
从定义角度分类——也就是函数是谁实现的
1.库函数 c库实现的
2.自定义函数–程序员自己实现的函数
3.系统调用-操作系统实现的函数
从参数角度分类
1.有参函数
函数有形参,可以是一个或者多个,参数的类型随便,取决于函数的功能
int max(int x,int y);
2.无参函数
函数没有参数,在形参列表的位置写一个void或者什么都不写
int max(void){} 或者直接写int max(){}
从带返回值的分类
带返回值的函数
在定义函数的时候,必须带着返回值类型,在函数体里,必须有return 如果没有返回值类型,默认为整型
没有返回值的函数在定义的时候用void 定义 例如void main(){}
所有的函数是平级的,不可以在函数内部在嵌套定义函数
函数的声明
对已经定义的函数进行说明,函数的声明可以多次
为什么需要声明?
有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,因为编译器在编译c程序的时候是从上往下进行编译的’
例如在同一.c文件中被调函数在下面,主调函数在上面则需要声明
声明方法
1.直接声明 将被调用的函数的第一行拷贝过去加分号就行
2.间接声明法
将函数的声明放在头文件中,.c程序包含头文件即可
函数的调用
如果该函数有返回值 则定义一个变量去接受该函数的返回值
例如 变量=函数名(实参列表)//带返回值的
不带返回值的 则直接调用该函数即可 函数名(实参列表);
内存的分区
物理内存:实实在在存在的存储设备
虚拟内存:操作系统虚拟出来的内存
在32位系统中,每个进程的寻址范围是4G 从0x00到0xff
在写应用程序的,看到的都是虚拟内存
在程序运行的时候,操作系统会将虚拟内存进行分区
1.堆
在动态申请内存的时候在堆里面开辟内存
2.栈
主要存放局部变量
3.静态全局区
3.1未初始化的静态全局区 静态变量或去全局变量,没有初始化存在此区
3.2初始化的静态全局区:全局变量,静态变量,赋过初值的存放在此区
局部范围内,重名的全局变量不起作用(就近原则)
#include <>用尖括号包含头文件,在系统指定的路径下找头文件
#include ""用双引号包含头文件,先在当前目录下找头文件,找不到,再到系统指定的路径下找
#define PI 3.14 3.14用PI表示
带参的宏定义
#define S(a,b) a*b
选择性编译
#ifdef __fun_h
#ifndef __fun_h 防止头文件重复包含
#else
#endif
指针变量:是一个变量,是一个指针变量,即这个变量用来存放一个地址编号
无论什么类型的地址都是存储单元的编号,在32位电脑中都是四个字节 ,也就是任何类型的指针变量都是4个字节大小
对应类型的指针变量,只能存放对应类型的变量的地址
举例:整型的指针变量,只能存放整型变量的地址
指针就是地址
指针的定义方法
1.简单的指针变量
数据类型 * 指针变量名
int * p;
在定义指针变量的时候用*来修饰变量,说明变量p是个指针变量
&去地址 *取值
int *p;
p=&a; 相当于p指向a
例如
int num;
num=*P; 相当于把地址为p中的值赋值给num;
同时定义多个指针变量
int *a,*b,*c;
int *a,b;
指针可以存放变量的地址编号
C语言规定:数组的名字就是数组的首地址,即第0个元素的地址,是个常量
指针的运算
1.指针可以加一个整数,往下指几个它指向的变量,结果还是一个地址
假如P保存的地址编号是2000的话,p+2代表的地址编号就是2008
如果q是数组,q存放的地址编号是2000的话 q+2代表的地址编号就是2002
两个相同类型指针可以比较大小
前提:只有两个相同类型的指针指向同一个数组元素的时候,比较大小才有意义
指向前面元素的指针小于指向后面元素的指针
两个相同类型的指针可以做减法
前提是:必须是两个相同类型的指针指向同一个数组元素的额时候,做减法才有意义,做减法的结果是,两个指针指向的中间个数的元素有多少
两个相同类型的指针可以相互赋值 (void *除外)
如果类型不相同的指针要想相互赋值,必须进行强制类型转换
指针和数组的关系
1.指针可以保存数组元素的地址
2.可以定义一个数组,如果数组中若干个相同类型的指针变量,这个数组就被成为2是指针数组
int *p[5];
指针的指针
int **p;
结构体 struct
在程序开发的时候,有时候我们需要将不同类型的数据组合成一个有机整体
如一个学生有学号/姓名/性别
为了方面管理该对象的所拥有的属性,就出现结构体类型
结构体就是构造类型,数组也是构造类型
构造类型:不是基本类型的数据结构也不是指针类型,它是若干个不同类型的数据的集合,描述一组具有相同类型数据的有序集合,用于处理大量相同类型的数据运算
结构体是一种构造类型数据是一种或多种基本类型或构造类型的数据的集合
例如
struct stu{
int num;
char name;
char sex;
}
struct stu{
int num;
char name;
char sex;
}STU1;
新的类型名称 STU1
STU1 BOY={1,“AAA”,‘F’};结构体类型赋初值
或者BOY.num=1;挨个赋初值
相同类型的结构体变量可以赋初值,必须是相同类型的结构体变量才能相互赋值
结构体数组
struct stu edu[5];
edu[0].num=0;
结构体指针
定义一个变量来存放该结构的地址,该地址就是结构体指针变量
struct 结构体类型名称 * 结构体指针变量