C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。
#include
int main()
{
printf("hello\n");
return 0;
}
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
一般普通变量:如123,3.5,“abc”, ‘a’ 很容易识别以变量形式展现的,要看标识符的定义形式,才能确定该标识符是常量,还是变量,如:const int a=5 ; //常量 有const修饰,变量不能修改int b=34; //变量#define 定义的宏,即不是常量也不是变量
int age=50;
float weight=45f;
char ch='d';
#include
int global=2019;//全局变量
int main()
{
int local=2018;//局部变量
//下面定义的global会不会有问题
int global=2020;//局部变量
printf("global = %d\n", global);
return 0;
}
总结:上面代码是没有任何问题的,当局部变量和全局变量相遇时优先局部变量。
作用域
作用域(score)程序设计概念,一段程序代码中所用到的名字并不总是有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
c语言中的常量和变量定义的形式有所差异。
c语言中的常量分为以下几种:
const
修饰的常变量#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
enum Sex
{
MALE,//枚举常量
FEMALE,
SECRET
};
int main()
{
3.14;//字面常量
1000;//字面常量
const float pai = 3.14f; //const 修饰的常量
pai = 5.14;//ok?
#define MAX 100 //#define的标识符常量
system("pause");
return 0;
}
"hello \n"
这种由双引号引起来的一串字符称为字符串字面值,简称字符串。
注意:字符串结束标志是一个\0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int Add(int x, int y)
{
return x + y;
}
/*C语言风格注释//不能嵌套注释
int Sub(int x, int y)
{
return x-y;
}
*/
int main()
{
//C++注释风格//可以注释一行也可以注释多行
//int a = 10;
//调用Add函数,完成加法
printf("%d\n", Add(1, 2));
return 0;
}
C语言条件控制语句选择结构,是属于计算机的语言编辑,有在C语言条件控制中的语句选择结构的存在,即是C语言条件控制语句选择结构。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
int coding = 0;
printf("你会去敲代码吗?(选择1 or 0):>");
scanf("%d", &coding);
if (coding == 1)
{
printf("坚持,你会有好offer\n");
}
else
{
printf("放弃,回家卖红薯\n");
}
system("pause");
return 0;
}
C语言循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int mian()
{
printf("作为一个程序员");
int line = 0;
while (line <= 20000)
{
line++;
printf("我要继续努力敲代码\n");
}
if (line> 20000)
printf("赢取白富美\n");
system("pause");
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
函数的特点就是简化代码,上述代码写成函数如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int Add(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
system("pause");
return 0;
}
所谓数组,是有序的元素序列。
[1]
若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。
[2]
这些无序排列的同类数据元素的集合称为数组。数组是用于储存多个相同类型数据的集合。
int arr[10]={ 1,2,3,4,5,6,7,8,9,10 };//定义一个整形数组,最多放10个元素
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。
算数操作符
+ - * / %
移位操作符
>> <<
位操作符
& ^ |
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置 后置--
++ 前置 后置++
* 间接访问操作符
(类型) 强制类型转换
关系操作符
> >= < <= != ==
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1,exp2,exp3, ...... expN
下标引用丶函数调用和结构成员
[] () . ->
auto break case char const continue default do double else enum extern
float for goto if int long register return short signed sizeof static
struct switch typedef union unsigned void volatile while
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
比如:
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
在c语言中:
static 是用来修饰变量和函数的
- 修饰局部变量
- 修饰全局变量
- 修饰函数
对比上面两个代码可以发现当static修饰局部变量时,它改变了变量的生命周期,让静态局部变量除了作用域依然存在,到程序结束,生命周期才结束。
//代码1
int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
//代码2
//add.c
static int g_val = 2018;
//test.c
int main()
{
printf("%d\n", g_val);
return 0;
}
对比可知,代码1正常,代码2会出现连结性错误。由此可知,一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件使用。
//代码1
//add.c
int Add(int x, int y)
{
return c + y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
//代码2
//add.c
static int Add(int x, int y)
{
return c + y;
}
//test.c
int main()
{
printf("%d\n", Add(2, 3));
return 0;
}
代码1正常,代码2错误。由此可知一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
内存
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
指针的使用条例
#include
int main()
{
int num = 10;
int* p = #
*p = 20;
return 0;
}
以整形指针为例,可以推广到其他类型,如:
#include
int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'q';
printf("%c\n", ch);
return 0;
}
#include
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(double*));
return 0;
}
指针大小在32位平台是4个字节,64位平台是8个字节。
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字 + 年龄 + 性别 + 学号 这几项信息。
这里只能使用结构体来描述了。
例如:
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
结构体的初始化:
//打印结构体信息
struct Stu s = { "张三", 20, "男", "20180101" };
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);