目录
1.数据结构
sizeof 是C里面的一个关键词,作用是获取占用空间的字节数
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
return 0;
}
输出1 2 4 4 8 4 8
2.格式化字符串规定符号
%d整型输出 %ld长整型输出,
%o以八进制数形式输出整数,
%x以十六进制数形式输出整数,
%u以十进制数输出unsigned型数据(无符号数)。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数(单双精度都可以)
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。
3.变量和常量
一、定义变量的方法
int num1= 150;
float num2= 45.5;
char ch = 'w';
二、局部变量和局部变量
在函数内的变量是局部变量,函数外的是全局变量;局部变量的生命周期从函数的开始到结束是一个生命周期,全局变量的生命周期是从程序运行到结束.
#include <stdio.h>
int global = 2019;//全局变量
int main()
{
int local = 2018;//局部变量
//下面定义的global会不会有问题?
int global = 2020;//局部变量
printf("global = %d\n", global);
return 0;
}
三、变量的使用
scanf 是格式输入函数
printf 是格式输出函数
& 是取地址
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d", &num1, &num2);//输入两个数,取num1和num2的地址将输入的数放入
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
五、定义变量的方法
常量只读,不可修改
3.1415926 //字面常量
const int A =3.14 //const修饰的常量
// const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。
//const 修饰的局部变量生命周期变成从程序运行到结束.
#define A 3.14 //#define定义的标识符常量
enum Colour //枚举中的内容都是枚举常量
{
BLUE,
YELLOW,
GREEN
};
4.字符串和转义字符
由双引号引起的字符称为字符串,单引号用来引起字符;字符串的结束标志是"\0",不占字符长度;“\”加特定的字符构成转义字符,当我们必需使用“\”时再加一个“\”使原“\”转义输出。
int main()
{
printf("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"); //输出\用\转义
return 0;
}
输出C:\ProgramData\Microsoft\Windows\Start Menu\Programs
\? 在书写连续多个问号时使用,防止他们被解析成三字母词
\' 用于表示字符常量'
\“ 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd 表示1~3个八进制的数字。 如: \130 X
\xdd dd 表示2个十六进制数字。 如: \x30 0
5.数组
数组的定义:一组相同类型的元素的集合
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
//[]里定义数组的元素个数
C语言规定数组的每个元素都有一个下标,下标是从0开始的;数组可以通过下标来访问的。
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
输出 1 2 3 4 5 6 7 8 9 10
6.操作符
算术操作符 + - * / %
移位操作符 >> <<
位操作符 & ^ |
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
赋值、关系操作符
逻辑操作符 &&逻辑与 ||逻辑或
条件操作符 exp1 ? exp2 : exp3
int main()
{
int a = 10;
int b = 20;
int max = 0;
max = a > b ? a : b;
printf("%d\n", max);
return 0;
}
输出 20
逗号表达式
exp1, exp2, exp3, …expN
下标引用、函数调用和结构成员
[] () . ->
7.常见关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
static 内部函数
extern 外部函数
ifdef
#ifdef X
....(如果X这个标识符定义了,运行这段程序)
#else
....(如果标识符没有定义,运行这段程序)
#endif (结束ifdef)
#ifndef X
....(如果X这个标识符没有定义,运行这段程序)
#else
....(如果标识符定义了,运行这段程序)
#endif (结束ifdef)
typedef
typedef unsigned char uint8_t(类型别名)
extern
extern 当申明的id不在同一个作用域时用extern申明
A文件
int a=10;
B文件 (直接使用a会报错,需要使用extern申明)
extern int a;
a=100;
static
Static申明的局部变量,存储在静态存储区 。
静态的局部变量在初始化时只会初始化一次,所以可以说static申明的局部变量,具有记忆功能。
Static申明的函数作用域仅限当前.c文件,其他.c无法调用
int getstaticvalue(void) (调用一次value就会加一,只有第一次value会赋0)
{
static int value=0;
value++;
return value;
}
int getstaticvalue(void) (调用一次value加一,再次调用value赋0重新加一)
{
int value=0;
value++;
return value;
}
_ _weak
_ _weak函数和重写的函数不能放在同一文件。
A.c文件里
void weak(void)
{
printf("s");
}
B.c文件里
_ _weak void weak(void)
{
printf("a");
}
如果没有重新定义weak函数,则会调用B文件里的,如果又定义了会执行A文件里的,weak降低调用等级
struct
struct A //结构体类型
{ //结构体成员(类型 成员名)
int a;
char b;
float c;
} X,Y; //结构体变量名
创建结构数组
struct
{
...
...
...
}A[3]={{... , ... , ...},
{... , ... , ...},
{... , ... , ...}};
struct
{
...
...
...
}A[]={{...},{...},{...}};
struct A
{
...
...
...
};
A[3]={{... , ... , ...},
{... , ... , ...},
{... , ... , ...}};