源文件的创建
目录
- 创建新项目后源文件添加新建项名称.c后缀
- 源文件首行的#define_CRT_SECURE_NO_WARNINGS 1可以在vss安装目录下找到newc++file.cpp使用notepad编写保存两次后自动生成.或者将该文件拖到桌面编辑然后复制到该目录下替换掉.
常见数据类型
- 常量有:①字面常量(直接写出来的常量) ②const + 字符类型 定义的常变量(它的本质还是变量只是有了常数的属性无法修改但是仍然不能在需要常量的表达式中使用) ③define 定义的标识符变量 ④enum枚举常量(如果要求输出这些常量会输出按照它们的顺序从1开始输出数字而不是该常量)可以使用常量 = 数字来给常量赋予初值.
- float类型数据的后面需要加上f例子如下:
float sum = 10f//表示单精度浮点型数据不然系统默认将该数据视为double类型数据级双精度浮点型
(没有列举所有的数据类型仅仅列出了需要我个人认为需要记忆的部分)
字符串与单个字符
- 由双引号引起的一串字符称为字符串自面值简称字符串.(字符串的结束标志是一个\0的转义字符但是被隐藏起来了不算作字符串内容也不算作字符长度 计算字符大小时要计算\0)
- 单引号引起的是单个字符,当输出单个字符时后面没有\0 算机便会一直寻找\0直到找到结束输出
全局变量与局部变量
- 全局变量不初始化默认为0;局部变量不初始化默认为随机值。
- 全局变量在其他源文件中使用前需要使用extern(声明外部变量)才能使用,否则编译无法成功.
原理:每一个.c文件经过 编译(生成.obj文件)-->链接-->生成可执行程序(.exe)
由于全局变量具有外部链接属性所以在链接期间可以找到外部的数据使用
函数
- 先定义函数
int 函数名(int x,int y)
{
函数内容
return =
}
int main()
{
int 变量 = 函数名()
return 0
}
操作符
- 运算操作符 + - * / %(取余符号)
- 位操作符(需要特别注意的是位移操作符并不会改变操作数)
- <<(左移操作符)将二进制序列数移动,如a=2即二进制00000000000000000000000000000010 ,a << 1 等于00000000000000000000000000000100 = 4(此时a仍然是2)
- >>右移操作符(有两种右移方式通常都是算数右移即算数符号位不变)
- &按位与 a = 2 ,b = 4
a & b = 0;
- |按位或 a = 2, b = 4
a | b = 6;
- ^按位异或 a = 2, b = 4
a ^ b = 6;
- 赋值操作符(a +=b;等价于a = a + b;(其他类似符号同理))
= += -= *= /= &= |= >>= <<=
- 单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个二进制数按位取反
-- 有前置--和后置--
++ 有前置++,后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
- (type_name) expression把变量类型转换成另一种类型(强制类型转换)expression指的是表达式可以是变量也可以是常量
- int a = 10;// ! 操作符举例理解
int b = !a;//a为真所以!a为0
- 条件操作符
exp1 ? exp2 : exp3
exp1为真整个表达式结果为exp2否则为exp3
- 逗号表达式
(exp1, exp2, exp3, ...,expn)从左至右依次计算,整个表达式的结果为最后一个表达式的结果。
关键字
- auto自动变量(auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。)c++标准下
- typedef(类型重命名) typedef 类型 自定义名称
- static 修饰局部变量可以在函数调用之间保持局部变量的值。static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。(修饰函数与全局变量同理)
- 解释static修饰局部变量的原理。(下图是内存的几个部分),本来局部变量是存储在栈区的该区域的变量是临时的进入该变量的作用域自动创建出了该范围自动销毁.static修饰后的局部变量改变了存储类型(存储在静态区),所以即使出了它的作用域仍然不销毁。static修饰的局部变量的生命周期等于程序的生命周期。但是你依旧不能在它的作用域外直接使用它(使用指针才可使用).
-
- static修饰全局变量改变了全局变量的链接属性,本来全局变量具有外部链接属性static修饰之后变为内部链接属性只能在本源文件内使用了。(全局变量同理)
- register(修饰变量建议将该变量放入寄存器中,最终是否放入寄存器要看编译器自己决定)
- define定义常量和宏(命名习惯define定义常量和宏最好都为大写字母,好与函数区分开,使人一看见就知道这是宏)
define定义常量例
#define NUM 20
define 定义宏 例
#define ADD(x,y) x+y
int main()
{
printf("%d/n"Add(2,3));
return 0
}
指针
每个内存单元都有编号,这个编号被称为地址/指针,下面是内存单位的转换.
4,294,967,296 bit
/8 =536,870,912bytb
/1024=524,288Kb
/1024=512MB
/1024=0.5GB
- 取地址操作:&a(a变量在内存中存储的首地址)
- 指针的存储:数据类型 * 指针变量名 = &需要存储的变量;
- 指针变量的大小等于地址的存放需要的空间.32位操作系统指针变量大小为4字节,64位操作系统指针变量大小为8字节。
- *pc = 'a'解引用操作,通过pc里面的地址,找到w改变变量(需要与上图结合)
总结
结构体
结构体初始化(两种方式)
struct stu * ps = &s;//结构体指针
printf("%s\n",ps->name);
printf("%s\n",(*ps).name);\\都是一样的不过推荐使用第一种更简洁明了
以上便是我对于C语言的一个大概认识.对于小白来说算是比较容易看懂的,制作不易希望各位看官给个三连谢谢啦!