C语言编译环境
c语言是编译性语言
1.gcc
gcc test。c
gcc test。c -o test
gcc -o test test.c
编译器主要组件:
分析器
汇编器
链接器
标准c库
gcc编译流程:
1.预处理
头文件包含
头替换
gcc -E test.c -o test.i
2.编译
gcc -S test.i -o test.s
3.汇编
gcc -C test.s -o test.o
4.链接
gcc test.o -o test
add.c sub.c test.c main.c add.h sub.h test.h
gcc *.c -o main --->>> | --->>> gcc -c add.c -o add.o
| --->>> gcc -c sub.c -o sub.o
| --->>> gcc -c test.c -o test.o
| --->>> gcc -c main.c -o main.o
| --->>> gcc *.o -o main
2.gdb调试工具
逻辑错误
gcc编译的时候增加 -g选项
gdb 可执行程序
查看文件
(gdb) l
设置断点
(gdb) b 6
查看断点情况
(gdb) info b
运行代码
(gdb) r
查看变量值
(gdb) p n
单步运行
(gdb) n
(gdb) s
恢复程序运行
(gdb) c
帮助
(gdb) help [command]
指针
地址:
内存单元的编号
变量:
是对内存单元的抽象
数据类型:
修饰变量 确定变量在内存中开辟的空间大小
1.指针
本质是数据类型 修饰变量 -- 确定变量在内存中开辟的空间大小
特点:指针修饰的变量在内存中开辟空间大小4字节,用来存放地址
2.指针变量:
int* a
3.指针和数组
指针:指针变量、地址常量都是指针
===============================================================================
数组:
构造数据类型
一般定义形式:
<数据类型> 数组名[数组元素个数];
数组名:数组的首地址,地址常量
数据类型:修饰的是数组元素的数据类型
在内存空间中的大小:sizeof(数组名) = 数组元素的个数 × sizeof(数据类型)
===============================================================================
举例:
int arr[5] = {0,1,2,3,4};
int *p = arr;
指针的运算:
+
-
++
--
==
!=
强制类型转换:
使数据类型相同
4.指针和字符串
字符串可以存放在数组里,需要连续的内存空间 -------数组就是连续的空间,数组可以存放字符串
char str[] = {'a','b','c','/0'}
char str[] = "abc"
char *p = "abcde"
printf("%s,%s\n",str,p);
5.指针数组和数组指针
指针数组:
指针用来修饰数组,本质是数组,该数组元素类型是指针变量或地址常量。
一般定义形式:
<数据类型>*数组名[数组元素个数];
数组指针:
本质:指针
指向一个二维数组
====================================================================================
二维数组:
一般定义形式:
<数据类型> 二维数组名[行数][列数];
在内存中存储方式:按行优先
行地址加一,等于移动一行,有多少列决定移动列数个元素
int【】【3】行数可以省略
==================================================================================
数组指针的一般定义形式:
<数据类型>(*数组指针变量名)[列数];
int (*p)[3] = a;
a[i][j] <==> *(a[i] + j) <==> *(*(a+i) + j) <==> *(*(p+i) + j)
<==> *(p[i] + j) <==> p[i][j]
6.多级指针
指向指针的指针,二级指针以上的指针
一般定义形式:
<数据类型>**二级指针变量名;
7.const和void
const:常量化
const int a;
看const修饰谁可以把数据类型去掉来看
const int *a;
int const *a;
in * const a;
void:空类型
作用:修饰函数的返回值,函数形参(说明函数不需要传参)修饰变量
void a;(会报错,因为不知道void能申请多少空间)
void *a;可以来定义一个void类型的指针
用void修饰的指针变量可以指向任何类型的地址