绪论
你可以看思维导图对C语言中的知识点有个轮廓性的了解,你就可以对于以下的知识通过我的目录看兴趣食用,最终你将在通过本篇文章大概的了解C语言中的一些知识。我会在后期发表更深入的知识分析
这些知识是对c代码的基本认识,是使自己了解大概C语言并可以大概的看懂其他人写的代码是什么意思。知道有这种东西,以防止对代码的畏惧心里,也使后期学习更轻松!
在看这篇文章时注意所写的代码语法,可以自己下载个vs2019来进行模仿,主要要清楚代码在书写过程中的语法,以及个个代码,函数,符号有什么意义,我会在代码后面加上注释请注意看这很重要,不懂可以评论哈
关于vs2019如何下载可以网上找方法也可以私信我,我可以提供便捷文件下载
所以安全带系好,发车啦(建议电脑观看)。
附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要
目录
C语言基本认识
1.变量:
1.1 定义变量:
1.2 变量的分类
1.3变量的使用
1.4变量的生命周期和作用域
2.C语言中的 “数据类型” 有
3.常量
4.1 注释
4.2转义字符
5.选择语句
6.循环语句
7.函数
8.数组
8.1字符串
9.操作符
10.常见关键字
11.#define定义常量和宏
12.指针
13.结构体
思维导图:
程序人生的开始 hellow world - -
#include<stdio.h> //头文件,为了使printf这一库函数有意义 int main()//主函数,从主函数这开始 { printf("hello world");//打印函数 return 0; }
C语言基本认识
他是一种高级语言,也是一种计算机语言(计算机和人交流的语言),使自己可以通过代码来控制计算机来完成自己所需
1.变量:
1.1 定义变量:
int a = 0; float weight = 75.5f; char ch = 'w';
int float char为储存的类型
a ,weight ,ch 为其变量的名称
等号后是一个初始值,可以变化
对于变量名称的注意事项:
1 不能数字开头 2 长度不超过63字符 3 区分大小写(A 和 a 不同 可取成 age Age )
4 同时还不能取关键字 5 对于变量的命名只能由字母,数字和下划线 _
1.2 变量的分类
局部变量(在某一大括号内) 和 全局变量(在主函数int main 外的)
局部优先原则:若局部变量的名字和全局的冲突,则打印输出时是用局部的打印输出,如下
#include<stdio.h> int a = 10;//全局变量 int main() { int a = 20;//局部变量在大括号内 printf("%d",a);//打印20 }
1.3变量的使用
如下代码 下面的使用了num1 num2 sum 三个变量具体下面已经注释了
#include<stdio.h>//头文件 int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("请输入俩个值:");//这是打印函数可以帮你打印但你要有上面的头文件才能打印 scanf("%d %d",&num1,&num2);//一个输入函数,你可以输入俩个数值代表num1和num2 sum = num1 + num2;//将你输入的值加到sum里 printf("sum = %d",sum);//同上次处是打印sum的值的,%d和sum对应上面的num也是一样的 return 0; }
1.4变量的生命周期和作用域
通过局部变量和全局变量通俗的了解
局部变量的生命周期和作用域:
局部变量的生命周期是当程序进人到局部变量所在的代码块(所在的大括号)时局部变量的生命开始当出该代码块时则结束了自己的生命周期,局部变量的作用域则在自己所在的代码块(和生命周期其实挺类似的);
全局变量的生命周期和作用域:
全局变量的生命周期程序是从开始全局变量的生命开始到return 0程序结束时全局变量生命也跟着结束,其作用域是整个工程(包括其他源文件)它有着外部链接属性
附:若要在其他源文件中使用全局变量,则需啊进行声明,声明外部符号(extern)
2.C语言中的 “数据类型” 有:
整形: int - 整形 char - 字符数据类型 short - 短整形 long - 长整形 ;
浮点型:float - 单精度浮点型 double - 双精度浮点型
附:浮点型(小数)特点 66.2 = 6.62*10^1(*表示乘法,^表示次方) / 6.62e1(e1表示10的1次方)
这些数据类型是用来选择变量的储存空间大小(就好比你要用多大的一个篮子背东西,篮子大东西却小则剩太多浪费影响其他的进程,而篮子小东西大了则你又放不下了)
char a = ‘w’ 注字符要带单引号
int 4 byte(字节) short 2 byte(字节) long 4 byte(字节)
float 4 byte(字节) double 8 byte(字节)
上面的内存就好比一般来说一个数字在内存中占一个比特位(bit)的大小
故一个byte这则表示成8个bit
转化公式: 1byte = 8bit 1kb = 1024byte 1MB = 1024byte
1GB = 1024mb 1TB = 1024GB
注:float weight = 75.5(此时75.5默认为double类型) float型只能存储到小数点后六位
故需要 float weight = 75.5f(方能改成float) double类型的有效位数可以达到16位
3.常量
有:字面常量,const修饰的常变量,#define定义的标识符常量,枚举常量
(再次注释,这些内容仅仅只是用来见识了解一些)
#include<stdio.h>//头文件,使调用的库函数有意义,如调用的printf打印函数。 #define M 3 //这种就属于 define定义 的常量可以直表示成 M = 3了可以吧M当成一个常量3来使用 enum Sex //枚举常量 { man, woman, secret }; int main()//主函数这是必须的不能不用 { 3.14;// 1000;//这两种都属于字面的常量 const int i = 0;//当在定义变量的前面加上 const 时会使该变量不能再变 //i = 100;//此时若这样写代码将会报错 //注意虽然他不能被改变但是他仍然是个变量 printf("%d\n",M);//该出打印出来的将会是3 printf("%d\n",man);//0 printf("%d\n",woman);//1 printf("%d\n",secret);//2 //从0开始向下递增 return 0; }
4
4.1 注释
有两种表示方法一种是
// code
/* code *\ (code:代码)
1.用来解释一些比较复杂的代码(上面代码内已经使用了)
2.可以用来除去一些没用的代码
不同注释的优缺点:
// 他的优点也是缺点是他能注释掉一整行代码 比较常用c++注释风格 快捷键Ctrl +k + c
而 /* .... *\ 优点是可以一次性注释多行代码但缺点是不支持嵌套使用 不怎么常用c语言风格。
4.2转义字符
其他转义字符
\ddd ddd表示1~3个八进制数字,如x130 -> 88(十进制) 他ASCII表代表的是‘X’
\xdd dd 表示2个十六进制数字 如x30 -> 48 而48在ASCII表中表示的是‘0
注:0 71 前面的0 表示这个数他是个八进制数字
0x 21 前面的0x则表示他是个十六进制数字
例如:\n 是一个换行转义字符 的用法
5.选择语句
if(表达式)
{
语句;
}
else if(表达式)
{
语句;
}
else
{
语句;
}
#include<stdio.h> int main() { int a = 0; printf("选1学习,选2打工\n"); scanf("%d",&a); if(a == 1) { printf("学业有成,发家致富\n"); } else if( a == 2 ) { printf("打一辈子工,辛辛苦苦\n"); } else { printf("输入错误\n") } return 0; }
if(判断是否成立成立则进反之下一个) else if (判断)
else:若if else if的判断均不能进则执行else
6.循环语句
while(判断)
{
语句;
}
while循环 for循环 do while循环
#include<stdio.h> int main() { int a = 0; while(a < 3) 若里面的判断为真a小于3则进入循环只到a大于3才不进人 { printf("%d",a); a++; } while(1) //为1,是真该循环将无限循环 { //... } while(0) //0为假不进去 { //... } return 0; }
while(判断若为真即进去) C语言中0为假 其他数均为真
for do while 这两个循环他们大致也差不多,这个两个暂时不讲述
7.函数
他就和数学中的函数一般你给一个x 后 可以求出一个y
返回类型 函数名 (数据类型+参数名,数据类型+参数名, ....)
{
code语句;
}
函数名(参数)
#include<stdio.h>//头文件 int Add(int x ,int y) //一开始的int表示返回的值的类型 括号里面的int表示传入值的类型 { int c = x + y; return c; //返回值 } int main() { int num1 = 0; int num2 = 0; printf("请输入俩个值:"); scanf("%d %d",&num1,&num2); int sum = Add(num1,num2);//这是一个Add函数来使传入的a,b变量进行函数内的计算最终返回一个值 printf("sum = %d",sum); return 0; }
这里面的Add()是个函数类似y,将传入的num1 num2,可类似看成二元函数
8.数组
定义:一组相同类型的元素的集合
用法:当要储存1~10或者更多数字时,可用数组来存。
数组的定义
数据类型 +数组名[数组大小] = { , ,} / " ... "
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//int类型 arr数组名 [10]数组内有几个元素(10个) //arr[0]第一个元素也就是1,arr[1]第二个元素也就是2,以此类推共有10个即最多到arr[9]
注:
1.“bit”和{‘b’,'i','t'}不一样如下 \0,是printf , strlen 的停止标志
2.若有初始化,则可以省略数组大小 arr[ ] = “bit” 反之arr[ ] 没有初始化则不能
注: 若arr[ ] = { 0 } 此时该数组只能存一个元素 否则则会爆出这种问题
8.1字符串
char arr[] = "hellow world",像这种用双引号框起来的就是字符串
字符串的结束标志是 ‘\0’(一般隐藏在字符串尾端),在计算字符串长度(strlen()一个库函数)时\0不计算在内并且以\0为结束标志
9.操作符
算术操作符:
+ - *(乘) /(除)
移位操作符:
<<(二进制左移操作符) >> (....右移操作符)
位操作符:
&(按位与) ^ (按位异或) | (按位或)
赋值操作法:
= (赋值性等于) += -= *= .....
a += 2 : a = a + 2 .....以此类推
单目操作符:
!(逻辑反操作符)将真改成假,假改成真
- (负值) + (正值) &(取地址)
sizeof (操作数的类型长度 单位字节 如int 4 个字节)
~(对二进制取反 0 -> 1 1 -> 0) -- ++ (前后置减减,加加)
*(解引用操作符) (类型)(强制类型转换)
关系操作符:
< <= > >= !=(不等) ==(判断性等于)
逻辑操作符:
&&(逻辑与,和数学中的并且类似一真则真) ||(逻辑与,一假则假)
注:若多次使用则,先确认前面的是否成立在确认后面的
条件操作符:
exp1 ? exp 2: exp 3
若exp1表达式成立则进入到exp2内,反之则进表达式3
逗号表达式:
exp1 , exp2 ,exp3......
结果为最后的eg.int a = 0;int b = 0; (a += 2;b += a; b += 2)->b = 4
10.常见关键字
extern :声明外部符号
//test.c extern int a;//声明另一个文件内的变量 #include<stdio.h> int main() { printf("%d",a); return 0; } //extra.c int a = 10;//全局变量具有外部链接属性
可以使不在一个源文件中的变量可以正常使用
register:寄存器
随着cup的发展速度不断加快,但cup向内存中访问读取的速度却不够,故需要更快的来处理。
C语言中可以表示成 register int a = 0; 如果a经常被使用则可以推荐a用register提高速度,这只是起到推荐作用,最终是否进行还得看操作系统。
typedef:类型重命名
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名 //unsigned 无符号的(正数) typedef unsigned int uint_32; int main() { //观察num1和num2,这两个变量的类型是一样的 unsigned int num1 = 0; uint_32 num2 = 0; return 0; }
将一些长且复杂的数据类型简单化成一些短的且好记的类型。
static(静态的)
static 可以修饰局部变量,也可称静态局部变量,还可以修饰全局变量,函数,同理也可以称...
1.修饰局部变量
int main() { int i = 0; while(i < 3) { int a = 0; a++; printf("%d ", a);//此时打印出1 1 1因为局部变量a出了代码块他就会被销毁 //当重新进来时又会重新创建一个新的a = 0; i++; } return 0; } //int main() //{ // int i = 0; // while( i < 3) // { // static int a = 0; // a++; // printf("%d ", a);//因为static改变了局部变量的生命周期(变成了静态变量) // i++; //使局部变量a的生命周期延长了故将会打印出 1 2 3并不会重新创建 // } // // // return 0; //}
static修饰局部变量改变了变量的生命周期 ,
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束
注:生命周期虽然和作用域相似但并不相等,用static只是延长了他的生命周期并不改变作用域
2.修饰全局变量
//代码1 //add.c int g_val = 2018; //test.c extern int g_val; int main() { printf("%d\n", g_val);//此处的g_val是可以正常打印的 return 0; } //代码2 //add.c static int g_val = 2018; //test.c extern int g_val; int main() { printf("%d\n", g_val);//无法打印 return 0; }
static 在全局变量处使全局变量的外部链接属性丧失变成内部链接属性
即使全局变量只能在本源文件中使用
3.static修饰函数:
和修饰全局变量类似,如下
//正常代码 //add.c int Add(int x, int y) { return c+y; } //test.c extern int Add(int, int);//声明 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 extern int Add(int, int);//声明内可不填名称只填类型 int main() { printf("%d\n", Add(2, 3));//此处因为static修饰了另一源文件中的函数以至于Add函数不能进行 return 0; }
11.#define定义常量和宏
1.#define 定义的常量
#define + 名称 + 某一值
#define M 3 //此处将M定义成了一个常量3,它还可以用到任何需要一个常数的地方,如数组.. int main() { int a = 4; if(a > M) printf("%d\n",a); return 0; }
2.定义的宏 如下
#define 名称(参数) (参数的运算也称宏体)
#define Add(x,y) (x +y)//定义的宏,与函数也类似,一般用来解决一些简单易写的步骤 #include<stdio.h> int main() { int a = 2; int b = 3; int c = Add(a,b); printf("%d\n",c);// 5 return 0; }
12.指针
12.1内存:
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
上面内容就好比你要找一个地方(内存单元)你得先知道他的地址(编号内存单元的地址),才能很好的去找到这个地方。
注:一个内存空间是一个字节,一个地址是4个字节
变量创建是创建在内存中的,在内存中分配了空间,即他们在内存中也是有地址的。
如何取出变量的地址,如下
#include <stdio.h> int main() { int num = 10; #//取出num的地址 //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
一般打印出来的是将二进制转化成的十六进制,且4个二进制表示成一个十六进制
如 : 1111 (2) = f (16) 0010 1101 = 2 d
一个二进制是一个bit 故一个十六进制是4个bit 则两个十六进制则是一个byte 即占一个内存空间
接上段代码 num最终打印的地址应该为0x0012ff44
地址的储存:(用指针变量来存)
int num = 10; int *p = #//p为一个整形指针变量 //int * 是pa 的类型和num的类型相同只是必须要在其后面加上* //* 用来表示pa是一个指针
指针的使用
int num = 10;//变量
int * p = #//指针指向变量
*p = 20;//指针改变所指的对象
#include <stdio.h> int main() { int num = 10; int *p = # //int * p 存了num 的地址 *p = 20; //*p利用上面存的地址找到num并进行改变成20 return 0; }
上面int * p 他是一个指针指向一个地址也可以看成指向一个内存空间,当指向某一个使可以用*p的方法来将他进行改变。
指针变量的大小:
#include <stdio.h> //指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位(即4个字节) x86 //64位平台下地址是64个bit位(即8个字节) x64 int main() { printf("%d\n", sizeof(char *)); printf("%d\n", sizeof(short *)); printf("%d\n", sizeof(int *)); printf("%d\n", sizeof(double *)); return 0; }
即指针的大小只能是4byte/8byte, 与对应的数据类型没有关系。
13.结构体
结构体一般用来描述一些复杂的类型解决一些常规数据类型无法描述的东西,如人:姓名,体重,身高....
struct + 名称1
{
结构体成员;
};
struct + 名称1 + 名称2 = { , , } 初始化
访问结构体:
名称2 . 结构体成员名 / 当用指针变量取了名称2的地址则还可以 (*p) . 结构体成员/ p -> 成员
struct Stu { char name[20]; //名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 }; // 注意分号 //结构体初始化,struct Stu + 名称 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); //->操作符 printf("name = %s age = %d sex = %s id=%s\n", (*ps).name, (*ps).age, (*ps).sex, (*ps).id); //(*ps)和上面的s是一个意思,其指代与它 //(*ps).name 和 ps->name ... 他们意思相同
今天就写到这,欲知后c如何,请看下回分说;