1. c语言特点
我的第一个c语言程序
#include<stdio.h>
int main()
{
printf("hello word\n");
return 0;
}
有志者,事竞成,破釜沉舟,百二秦关终属楚;
苦心人,天不负,卧薪尝胆,三千越甲可吞吴。×/
1.1 关键字
1.1.1数据类型相关的关键字
char , short , int , long , float , double , steuct , union .enmu ,singed , unsized , void
char 字符型,用char 定义的变量是字符型变量,占1个字节
char ch=‘a'’;
short 是短正型,用short 定义的变量是短整形变量,占2个字节
short int a=11;
int 是整型,在32位系统下占4个字节,16位平台下占2个字节
int a=44;
long 长整型,在32位系统下占4个字节
long int a=66;
float 单浮点型(实数),占4 个字节
float b=3.8f;
double 双浮点型(实数),占8 个字节
double b=3.8;
struct 是与结构体相关的关键字,可以用来定义结构体类型,以后将结构体的时候具体讲
union 是共用体,联合体相关的关键字,以后讲
enum 是枚举类型的关键字,以后讲
signed 有符号(正负)的意思
在定义char , int, short ,long ,数据的时候用signed修饰,代表定义的数据是有符号的,可以保存正数,也可以保存负数
例1: signed int a=10;
signed int b=6;
注意:默认请况下signed可以省略。
unsigned是无符号的意思
在定义char , int , short . long ,数据时用unsigned修饰,代表定义的数据是无f符号的数据,只能保存正数和0.
unsigned int a=101;
扩展 正数和负数在内存中到底是怎么存的
原码 , 反码, 补码
规定:
正数的原码,反码,补码相同
5
0000 0101
负数 -5
最高位为符号位 最高位为1代表是个负数
源码:
1000 0101
反码,除了符号位,其余位取反
11111010
补码: 反码+1
1111 1011
注意,负数在内存是以补码的形式存放的
例1:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a=-5;
printf("%d\n",a);
printf("%x\n",a);
return 0;
}
void 空类型的关键字
char、int 、float 都可以定义变量
void不能定义变量,没有void类型的变量
void是用来修饰函数的参数或者返回值,代表函数没有参数或没有返回值
例1:
void fun(void)
{
}
代表fun函数没有返回值,fun函数没有参数
例2:
#include <stdio.h>
int main()
{
char a;
short int b;
int c;
long int d;
float e;
double f;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(b));
printf("%d\n",sizeof(c));
printf("%d\n",sizeof(d));
printf("%d\n",sizeof(e));
printf("%d\n",sizeof(f));
return 0;
}
1.1.2存储相关关键字
register、static、const、auto、extern
register 是寄存器的意思,用register修饰的变量是寄存器变量,
即:在编译的时候告诉编译器这个变量是寄存器变量,尽量将其存储空间分配在寄存器中。
注意:
1:定义的变量不一定真的存放在寄存器中。
2:cpu取数据的时候去寄存器中拿数据比去内存中拿数据要快
3:因为寄存器比较宝贵,所以不能定义寄存器数组
4:register只能修饰 字符型及整型的,不能修饰浮点型
register char ch;
register short int b;
register int c;
register float d;//错误的
5:因为register修饰的变量可能存放在寄存器中不存放在内存中,所以
不能对寄存器变量取地址。因为只能存放在内存中的数据才有地址
register int a;
int *p;
p=&a;//错误的,a可能没有地址
static 是静态的意思
static可以修饰全局变量、局部变量、函数
这个以后的课程中重点讲解
const
const 是常量的意思
用const修饰的变量是只读的,不能修改它的值
例3:
const int a=101;//在定义a的时候用const修饰,并赋初值为101
从此以后,就不能再给a赋值了
a=111;//错误的
const可以修饰指针,这个在以后课程中重点讲解
auto int a;和int a是等价的,auto关键字现在基本不用了
extern 是外部的意思,一般用于函数和全局变量的声明,这个在后面的课程中,会用到1.1.
1.1.3 控制语句相关关键字
if else break contrnue for while do swish case goto default
1.1.4 其他关键字
sizeof
是用来测变量/数组的占用存储空间的大小
例4:
int a;
int numl
num=sizeof(a);
typedef 关键字,作用是给一个已有的类型,重新起个类型名,并没有新建一个类新
例如:
INT16 a;
U8 ch;
INT32 b;
这些都是typedef定义出来的新的类型名,其实就是unsigned char 及 short int 的别名
typedef 其别名的用法:
1 . 用想起名的类型定义一个变量
short int a;
2. 用新类型名替代变量名
short int INT16;
3 . 在最前面加typedef
typedef short int INT16;
4. 用新的类型名定义变量
INT16 b;
volatile 以改变的意思
用volatile定义的变量,是已改变的,集告诉cpu每次用volatile变量的时候,重新去内存中取,保证用的是最新的值,而不是集村其中的备份。
关键字的命名规则
在C语言中给变量和函数起名的时候,由字母 数字 下划线构成,必须以字母或下划线开头
格式化输出字符:
%d 十进制有符号整数 %u 十进制无符号整数
%x 十六进制表示的整数 %o 以八进制表示的整数
%f float 型浮点数 %lf double型浮点数
%e 指数形式的浮点数
%s 字符串 %c 单个字符
%p 指针的值
不同类型之间混合运算时涉及到类型的转换问题,有两种中转换形式:自动转化 强制类型转换
自动转换规则:占用内存字节少的类型,向占用内存字节数多的类型转换,以保证精度不降低
2.1 数组的概念
数组是若干个相同类型的变量在内存中有序存储的集合。
int a[10];//定义了一个整形的数组a,a是数组的名字,数组中有10个元素,每个元素的类型都是int 类型,而且在内存中连续存储。这10个元素分别是a[0] a[1] ......a[9],并且连续存储。
2.2 在程序运行时,操作系统会将内存分区
1. 堆
在动态申请内存的时候,在堆里开辟内存
2.栈
主要存放局部变量
3.静态全局区
1. 为初始化的静态全局区
没有初始化的静态变量(定义变量的时候,前面加static修饰),没有初始化的全局变量
2.初始化的静态全局区
初始化的静态变量和全局变量
4.代码区
存放程序代码
5. 文字长常量区
存放常量