1、#include 、main函数
#include <stdio.h> // standard input output . header
/*
1、预处理指令,将stdio.h文件拷贝到当前文件
2、 <stdio.h> —— 去linux系统路径/usr/include寻找stdio.h文件
"stdio.h" —— 先在当前文件所在目录寻找stdio.h文件,找不到再去/usr/include去找stdio.h
两者都能找到,考虑时间效率问题
*/
// main函数, 目前写法
int main(void)
{
}
// main函数标准写法
int main(int argc, char **argc)
{
}
// main函数完整版
int main(int argc, char **argc, char **envp)
{
}
2、gcc编译器
1、懒人编译:
gcc hello.c 得到 a.out(a => application应用 ;out => output 输出)
2、编译过程——四步骤/三步骤
gcc步骤
1、预处理
将源文件中包含的头文件拷贝到当前的.c文件中
#include<stdio> gcc编译器第一步会将stdio.h头文件的内容拷贝过来
gcc -E hello.c -o hello.i (只进行预处理步骤,得到i文件)
2、编译
将预处理文件得到的.i文件进行编译得到汇编文件(汇编文件:.s/.S => 汇编代码)
gcc -S hello.i -o hello.s (计算机依旧识别不了)
gcc -s hello.i -o hello.s
3、汇编
将编译后等到的.s文件经过汇编得到计算机可以识别的机器文件(目标文件)
gcc -c hello.s -o hello.o (o => object)
4、链接
将c语言中原有代码,如printf函数的实现代码和我们自己编写的代码整合起来形成二进制可执行程序
|xxxxxxxxxx|.o + |yyyyyyyyyyy|.o = 二进制可执行程序
自己的代码 原有代码
gcc hello.o -o hello
gcc选项:
-E:预处理,只会拷贝头文件
-o:指定输出文件名
-S:只进行编译步骤
-c:只进行汇编步骤
3、gcc正常使用
gcc xxx.c -o xxx
gcc hello.c -o hello
3、关于内存
内存——运行程序
1、原则上,任何程序访问内存前需要先分配内存
2、内存是一步一步探索
3、存储区存储数据,获取该存储区的首地址即可
闪存——存储数据(视频、音频、文字、程序)
4、关于变量
1、变量的命名
驼峰命名法(aaaAaa)
int stuHeight = 178;
下划线命名法(aaa_aaa)
int stu_age = 178;
2、变量输出
/*
*printf输出函数演示
*/
#include <stdio.h>
int main(void)
{
int a = 30; //分配4字节存储区,存储数据30
printf("hello, world\n");
printf("This num is %d\n",a);
return 0;
}
3、转义符
5、数据类型
1、关于数据类型
字符类型也是一个整型数据,占位符为%hhd,但可以用字符方式处理该类型,占位符为%c
关键字 占位符 分配内存 值域
char - half half %d -%hhd / %c 1 字节 -128~127
unsigned char - %c 1 字节 0~255
int -%d 4 字节
unsigned int -%u 4
short (int) - half %d - %hd 2
unsigned short (int) - half %u - %hu 2 0~65535
long (int) - long %d - %ld 4(32) / 8(64)
unsigned long (int) - long %u - %lu 4/8
long long (int) - long long %d - %lld 8
unsigned long long (int) - long long %u - %llu 8
float - %f 4
double - %f / %g / %e 8
注:
double num = 3.14159;
printf("%f\n", num); // 输出:3.141590
printf("%e\n", num); // 输出:3.141590e+00
printf("%g\n", num); // 输出:3.14159
数据类型决定了访问内存的方式
数据类型内存
8位系统 32 64
int 2 4 4
float 4 4 8
sizeof关键字
sizeof(param):
- 计算内存大小,以字节为单位
- 参数param可以是类型、变量、表达式
- 不计算参数值,只关注参数类型(赋值做无效处理)
- sizeof(a),sizeof(int),sizeof(520),sizeof(1+1)
- 占位符 %lu
man ascii // 查看对应ascii值
char a = 'c' 实际存入内存的是数字
2、字符数据类型
- 字符常量:用单引号括起来表示
- 字符变量:(signed) char / unsigned char 占1字节内存
6、关于进制数
OCT - 八进制
DEC - 十进制
HEX - 十六进制
1 Byte = 8 bit (1 字节等于 8位)
int 4 字节 -32位
short 2 字节 -16位
char a = 0b01111111 11111111; (输入)
a = 0b11111111;(实际)
原因char类型只占1字节(8位),先输入被后输入覆盖
7、C语言的动态(堆)内存分配
// 动态堆内存分配
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *pm = (int*)malloc(4); // 分配四字节内存
*pm = 28;
printf("Value of pm: %d\n", *pm);
printf("pm address is: %p\n", (void *)pm);
free( pm );
return 0;
}