C语言
数组
存储一个数据可以定义一个变量,但是如果要存储多个数据的话,变量太多就比较麻烦,这时使用数组就再合适不过了!
数组定义
int arr [ 5 ] = { 1 , 2 , 3 , 4 , 5 }; // 定义一个整形数组,最多放5 个元素
数组的下标
每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
int arr [ 5 ] = { 0 };// 如果数组5 个元素,下标的范围是 0-4第一行为值,第二行表示不同值对应的下标
数组的使用
int main()
{
int arr[5] = {1,2,3,4,5};//开辟空间为5的数组并赋值
for(int i=0; i<5; i++)
{
printf("%d ", arr[i]);//通过下标访问数组中的每个元素,并打印
}
printf("\n");
return 0; }
操作符
先对操作符做简单了解
算术操作符例如:+ - * / %移位操作符>> <<位操作符& ^ |赋值操作符= += -= *= /= &= ^ = |= >>= <<=单目操作符! 逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置、后置 --++ 前置、后置 ++* 间接访问操作符 ( 解引用操作符 )( 类型 ) 强制类型转换关系操作符>>=<<=!= 用于测试 “ 不相等 ”== 用于测试 “ 相等 ”逻辑操作符&& 逻辑与|| 逻辑或条件操作符exp1 ? exp2 : exp3 (这是一个三目运算符,如果exp1为true,执行exp2.否则执行exp3)下标引用,函数调用,结构体成员[] () . ->
常见关键字
auto break case char const continue default do double else enumextern float for goto if int long register return short signedsizeof static struct switch typedef union unsigned void volatile while
个别关键字介绍
关键字
typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
用法: 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; }
关键字
static
在C语言中:static是用来修饰变量和函数的1. 修饰局部变量-静态局部变量2. 修饰全局变量-静态全局变量3. 修饰函数-静态函数
具体解释:
修饰局部变量代码示例:如果我们要打印1到10,那么此时代码1则达不到效果,代码2中的变量i加了static可以做到#include <stdio.h> void test() { int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; } //代码2 #include <stdio.h> void test() { //static修饰局部变量 static int i = 0; i++; printf("%d ", i); } int main() { int i = 0; for(i=0; i<10; i++) { test(); } return 0; }
对比结果可得结论:static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束, 生命周期才结束。
修饰全局变量代码示例://代码1 //add.c 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出现Link错误
结论:一个全局变量被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在编译的时候会出现Link错误.结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
defifine 定义常量和宏
代码示例:
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
指针
内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是 1 个字节 。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该 内存单元的地 址 。
变量都有地址,取出变量地址如下:
int main() { int num = 10; #//使用&取出num的地址 //注:这里的int类型的num有4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
取出地址放到哪里(如何存储),这时就需要定义指针变量。
int num = 10; int* p;//p为一个整形指针变量 p = #//用p存储num的地址
指针的使用实例:int main() { int num = 10; int *p = # *p = 20; return 0; }
除了整形类型指针,还有其他的类型指针
int main() { char ch = 'w'; char* pc = &ch; *pc = 'q'; printf("%c\n", ch); return 0; }
指针变量的大小
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); //->操作符 struct Stu *ps = &s; printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps- >id);
总结:以上基本就把C语言的主要知识进行了一个大概的介绍。
接下来的内容将会详细去介绍C语言中的各块内容,如果各位大佬发现有不正确的地方,欢迎指正与批评!