一 第一个C语言程序
#include<stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
关于main函数
main函数是程序的入口 一个工程可以有多个源文件 但是只能有一个main函数 main函数结束时 也代表着整个程序的结束(其实我不知道这里的程序这个词使用的恰不恰当)
关于sdtio.h
这个是使用库函数printf的一个必要的声明 这个里面包含了printf函数的声明 因为一个函数使用之前必须要声明 无论是自定义函数还是库函数 又因为不被static限定的函数都有外部连接属性 也就是不同的文件中可以使用在某一个文件中定义的函数 所以必须在使用printf函数之前将其声明 而这个声明就在stdio.h中包括了
二 数据类型
char 字符数据类型 在内存中占1字节 %c
short 短整型 在内存中占2字节
int 整型 在内存中占4字节 %d
long 长整型 在内存中占4字节(long long 略了)
float 单精度浮点型 在内存中占4字节 %f
double 双精度浮点型 在内存中占8字节 %lf
这些 是C语言的内置类型
为什么要设置这么多的类型呢?
1 为了表达各种类型的数据 比如char 用来存储各种字符 int用来存储整数 而float用来存储小数
2 int short这种的设置是为了节省内存空间 比如你设置一个10 其实存储在short里面就足够了 而若存储在long里面 就显得空间浪费了
三 变量和常量
常量 用来存储不变的量 比如圆周率 一个匀速运动汽车的瞬时速率等
变量 用来存储变的量 比如一个人的身高 体重等
变量的分类
下面会用到的一些概念:
作用域: 一段程序代码中所用到的名字等并不总是有效的/可用的 而限定这个名字的可用性的代码范围就是这个名字的作用域 就是 所有可以使用某变量的区域就是这个变量的作用域 而作用域以外是不可见的也不可使用的
生命周期:变量的创建到变量的销毁的一个时间段
局部变量
定义在{}内的变量或者函数的形式参数称为局部变量 局部这个词用的就很好 它是某一小区域内的变量
性质:局部变量的作用域是变量所在的局部范围 局部变量的生命周期是: 进入作用域生命周期开始 出作用域生命周期结束
全局变量
全局变量 即定义在函数之外的 不在某一局部范围内或{}内的变量
性质: 全局变量的作用域是整个工程 全局变量生命周期是整个程序的生命周期
联想:全局变量在其他文件中也引用 只需在其他文件中用extern声明即可 若想让某全局变量的使用范围只限于本文件中 则用static声明此全局变量即可
当局部变量与全局变量同名时 局部变量优先使用
常量
字面常量 / const修饰的常变量 / #define定义的标识符常量 / 枚举常量
枚举常量:

枚举常量的默认值从0开始 向下依次增1
四 字符串/转义字符
字符串
“helle world \n”
这种由双引号引起的一串字符 称为字符串字面值 或简称字符串
'\0'是字符串的结束标志 若定义字符数组时以上方形式定义 则在字符串的末尾自动加一个'\0' 这是打印或者计算字符串长度时 都会在\0处停止

arr1 arr3 arr4是相同的 只是arr1的'\0'是编译器自动加的 而arr3 arr4是人工加的 且 字符'\0'的ASICC码值就是0 所以arr3 arr4同 但是与'0'是不同的 因为'0'是数字0的字符形式
而对于arr2 arr5 他们后方多会儿出现'\0'是随机的 所以打印出的字符串与字符串的长度都是随机的(strlen函数计算的字符串的长度不包括'\0' 只是字符串的有效长度)
转义字符
顾名思义就是转变某字符的原本意思 当某字母或几个字母前加上\时 含义被改变 如 '\n' '\a' '\123' '\x12' 都是转义字符
关于转义字符的统计表格 就不写了 书上网上都有



最下方的printf \62是一个字符 格式为'\xxx' xxx表示1-3个8进制数字 转变为10进制后 再对照ASCII码表 即可找到其指示的字符 (因为8进制数字中不可能有8)
五 注释
// 或 /* ... */ 前者为c++风格 后者为c风格 前者好用很多
六 选择语句
if ... else / if ... else if ... else if ... else ...
七 循环语句
while do ... while for
for(语句一; 语句二;语句三) {....}
计算顺序为 执行一 判断是否符合二 若符合 则执行{}内的语句 执行三 判断是否符合二 若符合 则执行{}内的语句...........
八 函数
基本定义和使用略了 函数使用前必须定义 或者声明 函数具有外部连接属性 若用static修饰后 即变为内部连接属性 则此函数只能在本文件内只用 其他文件中不可见
() 这个是函数引用操作符 一个操作对象是函数名 一个是函数实参
九 数组
其实这里包含了字符串数组的相关知识 在上文中已经写到了
关于整型数组的定义 初始化等 就不写了吧 没什么意思感觉
十 常见关键字

auto
此关键字为 自动 用于定义变量时的声明 其实这个关键字在大部分定义时都会用到 只是有与无效果一样 如 int a=10; 前方隐藏了一个auto
const
常 用于定义常变量 即变量的值不可变 如 const int a=10;
extern
用于声明外部函数或外部变量 即在源文件a中定义了某全局变量a 或某函数max 则在源文件b中用extern声明这个变量/函数即可在源文件b中使用此变量或函数 前提是该全局变量或函数不被static限定
register
用于定义寄存器变量 当某变量使用极其频繁时 可以将该变量声明为寄存器变量
声明某变量为寄存器变量只是建议性的 不是指令性的 还需编译器自己决定
typedef
此关键字为 类型定义关键字 即对类型重命名
如
static
关键字static 其实最开始学的时候 我总是把这个和const联想起来 其实没有任何联系的
1 static 修饰局部变量
static修饰局部变量改变了变量的生命周期 (不改变定义域 出了定义域该局部变量仍然不可见)
让局部变量变为静态局部变量 静态局部变量出了作用域仍然存在 到程序结束 生命周期才结束
补充: 前面说到了静态局部变量的生命周期就是整个程序的生命周期 最开始不理解 意思是程序刚开始时 这个静态局部变量就创建了吗 后来问了一下 确实是 : 在编译期间 静态局部变量和全局变量就已经创建了 所以说静态局部变量的生命周期就是整个程序的生命周期(生命周期就是变量从创建到销毁的时间间隔)
2 static 修饰全局变量
static修饰全局变量后 使这个变量只能在本文件内使用 不能在其他源文件内使用
使该全局变量原本具有的外部连接属性变为内部连接属性 用于反extern操作
3 static 修饰函数
与修饰全局变量类似 修饰函数后 函数的外部连接属性变为内部连接属性 即在其他源文件中不可通过声明此外部函数 来调用此函数 用于反extern操作
十一 #define定义常量和宏
1 定义常量 2 定义宏

十二 指针

上图为指针的一个基本用法 这里主要是想说关于指针的一些概念的理解
内存
说到指针 就必须说到内存 因为指针所指向的是变量的存储空间 而变量是存储在内存中的(除了寄存器变量外) 而我们平常所说的内存 有4G 8G 16G 等 计算机将他们分为若干个以字节为基本单位的空间 而1字节就是一个char型变量的存储空间 且 1byte = 8 bit 每一个bit位存储的都是1或0 即二进制位 将内存分为若干个小的存储单元后 给每一个字节编号 而他们的编号就是这个存储空间的地址
指针
所以当我们建立一个int型变量a时 在内存中就开辟了4字节的空间用来存储这个变量的内容 比如上方的10 假如它的地址为 0x1133ff41 0x1133ff42 0x1133ff43 0x1133ff44 这是它所占的四个字节的编号 这时 创建一个指针变量 pa 它的类型为 int* int为这个指针所知变量的类型 而*表示这是一个指针 int*pa=&a 就把a的起始地址给了pa 即pa里面存储的就是0x1133ff41
而pa存储的是整型变量a的起始地址 那么就可以通过这个地址找到对应的内存空间 就类似于用过一个现实中的地址 比如某小区x#301号房间一样 而下面的*pa 就是通过pa中存储的地址 找到对应的存储单元 就是变量a所在的内存空间 这样就可以引用这段空间 也可以改变这里面存储的内容
指针的大小
那么对于这个整型指针变量 它也属于一个变量 那么它是如何存储这个地址的呢? 是否会因为整型指针变量 和 字符型指针变量不同 这个变量的存储空间也有所不同呢? 答案是否 所有的指针变量所占的存储空间都是4个字节 且同样是在内存中开辟4字节来储存这个地址 那么为什么是4字节而不是5 或者6 或者7呢? cpu会为每一个字节的内存生成一个虚拟地址 而32位虚拟地址空间生成了32位的地址 这是32位0或1的二进制数字 来作为某个字节的地址编号 那么也就是说每一个字节的地址都是一个32位二进制数字 32bit位也就是4字节 所以需要4个字节的空间来存储这个地址 而不管什么类型的指针变量 都是存储的所指向变量的起始地址 所以 任何类型的指针变量大小都是4字节

十三 结构体
结构体是一种自定义类型 用来表示一种复杂对象 比如 人 如果你只用185cm去描述这个人 就显得很片面了 因为人这种复杂对象 是有很多种属性的 所以就有了结构体来描述这种复杂对象

上图是结构体的一个基本使用 如果你创建了一个结构体 则这是一种抽象的形式 只有创建结构体变量 才能将这个结构体实例化 也才占了存储空间
格式 :
结构体变量 . 属性
结构体指针 -> 属性
补充: 试了一下 发现不能 people p1={...}; 这样是不对的 好像这种形式是c++中新加的

299

被折叠的 条评论
为什么被折叠?



