C语言--基本结构--
1.main函数(所有C语言代码都要包含)
main函数 标准格式:
<可选返回值类型> main (<可选参数>) {
<可选的过程语句或函数调用>;
}
如果没有指定 返回类型,就使用 int 型。有些情况下因为 未指定int 或 指定void 而报错。
C语言语句中,必须有 过程语句(一些 操作数据或变量 的命令)与 函数调用。
命令行参数下,使用下列格式:
<optional return value type> main (int argc, char * argv[]) {
argc 是提供给 主函数的 参数个数,
argv 是参数的 字符串数组的 指针。 保存 形参(字符串)
程序名 存放在 偏移地址argv[0] 处。
void 声明 函数 无返回值 或 无参数,声明 无类型指针。
2.函数
函数格式:
<可选返回值类型> 函数名 (<可选函数参量>) {
}
该语句 告知 返回值的存在 以及 是否调用实参 填补 形参。
函数调用格式:
<用于存储返回值的可选变量 =>函数名(参数(如果由函数签名(上述函数格式)调用));
举例:
#include <stdio.h> //先添加 头文件,他们包含了 调用函数的声明,
#include <stdlib.h> //如printf 属于 stdio.h, exit 属于 stdlib.h。
//如果不知道 动态链接函数的 头文件 时,请查阅手册 [man 函数]。
int main(void) { //main里指定 void, 这种情况下 不需给变量传递实参替补。
int val_x; //创建 变量x
val_x = foo(); //调用foo 函数, 返回值 赋予给 x.
printf("the value returned is: %d\n", val_x); //printf 在屏幕上显示 foo 返回值 8,使用 格式字符串%d, 可以把 x 作为 十进制。
exit(0);
}
int foo(){ //此处定义函数 foo
return 8; //函数的返回值 为 8.
}
函数调用 修改了 程序流,这时 程序执行逻辑 暂时跳转到 函数中(如上述 跳转到 foo 签名代码块。执行完 被调函数 后, 流程 返回到 调用指令下 虚拟内存位置的 主调函数。
3.变量
int | 有符号整数值 | 可变,与 计算机位数 相关 |
float | 有符号浮点数 | 4字节 |
double | 较大浮点数 | 8字节 |
char | 单个字符 | 1字节 |
变量 会被 预先分配 固定长度的内存。
注:sizeof 函数 可以获取 确切的内存长度。
变量 在代码起始处 定义,定义格式:
<变量类型><变量名>=<值>
修改变量值 格式:
目的值 = 原值 <附加可选操作>
4.printf 函数 (在libc库中)
直接格式:printf(<字符串>);
格式化格式:printf(<格式化符号>, <一组变量/值>);
格式化符号
%n | 不予显示 |
%d | 十进制 |
%s | 字符串值 |
%x | 十六进制值 |
%f | 浮点值 |
5.scanf函数
该函数 用于 获取用户输入。
格式:
scanf(<格式化符号>, <一组变量/值>);
使用时,在 变量名 前 加&; 表示 将值 存入 变量指代的内存地址。 如
scanf("%d", &number);
6.循环 和 条件判断:for & while 与 if else
7.注释://单行 /**/多行
8.编译
注:编译器 通过 链接 将各目标码文件 链接为 可执行二进制文件。
gcc 为 GNU C Compiler;
-o | <filename> 使用指定文件名保存编译后的二进制代码。默认会将输出保存为a.out |
-S | 生成一个包含汇编指令的文件,文件扩展名为.s |
-ggdb | 生成额外的调试信息,在使用GNU调试器(gdb时比较有用) |
-c | 编译但不进行链接。生成一个带有.o扩展名的目标文件 |
-mpreferred-stack-boundary=2 | 使用DWORD长度的栈来编译程序,这简化了学习时的调试过程 |
-fno-stack-protector | 禁用栈保护(gcc 4.1引入)。在学习缓冲区溢出时,这是一个有用的选项 |
-z execstack | 启用可执行栈。在学习缓冲区溢出时,这是一个有用的选项 |