本期博客面向初始c语言的同学,无深入的内容,即将步入大学的理工科友友们可以放心冲!!!!
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。
电脑分为各种硬件和操作系统(windows)以及驱动层,C语言主要操作下层和底层。简单来说C语言是一门和计算机沟通的语言就像是英语汉语语言,以后还会学更多语言比如Java,C++等等。
同学们先跟着我一起操作,代码原理我下面会讲
写第一个c语言前我们先下载一个编译器,相当于翻译软件。
下面是我分享的链接,同学们可以放心食用,没有期限哦。
链接:C语言编译器vs2019下载百度网盘链接
提取码:qwer
ok我们进入正题
1.点开软件我们会看见这样一个界面,点击创建新项目
2.点击后会弹出这样一个界面,我们选择空项目,点击下一步
3.输入你项目名称,然后选择项目所在路径(点击三个点的那个按钮就可以自定义),然后创建
4.右击Project2然后鼠标放在添加,然后点击新建项
5.然后显示一个这样的界面,依旧选择C++文件,将下面的名称该为某某.c
为啥这样呢因为vs只能创建C++文件,但C++ 是C语言的超集,兼容C语言,
然后点击添加就行了。
6.然后输入代码就可以点击上方空三角形运行。
#include
int main() {
printf("我的第一个C语言程序");
return 0;
}
作者从一段最简单的C语言代码开始说起,这段代码的输出是“我的第一个C语言程序”。作者使用的是VS2019编译器。那么我们该如何理解这段代码。首先我们会最先看到最上面的#include
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
//C语言有没有字符串类型?
#include
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
return 0;
}
在不同的系统上,这些类型占据的字节长度是不同的:
在32 位的系统上
short 占据的内存大小是2 个byte;
int占据的内存大小是4 个byte;
long占据的内存大小是4 个byte;
float占据的内存大小是4 个byte;
double占据的内存大小是8 个byte;
char占据的内存大小是1 个byte。
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
只能由字母(包括大写和小写)、数字和下划线( _ )组成。
不能以数字开头。
长度不能超过63个字符。
变量名中区分大小写的。
变量名不能使用关键字。
c语言中输出的类型格式
1、%d-以十进制形式输出带符号整数;
2、%o-以八进制形式输出无符号整数(不输出前缀O);
3、%x-以十六进制形式输出无符号整数(不输出前缀OX);
4、%u-以十进制形式输出无符号整数;
5、%f-以小数形式输出单、双精度实数;
6、%e-以指数形式输出单、双精度实数;
7、%g-以%f%e中较短的输出宽度输出单、双精度实数;
8、%c-输出单个字符;
#include
int main()
{
int a = 1;
double b = 1.0;
float c = 1.0;
char d = 'a';
short e = 1;
long f = 1;
printf("%d %lf %f %c %d %d", a,b,c,d,e,f);
return 0;
}
#include
int global = 2019;//全局变量
int main()
{
int local = 2018;//局部变量
//下面定义的global会不会有问题?
int global = 2020;//局部变量
printf("global = %d\n", global);
return 0;
}
总结:
上面的局部变量global变量的定义其实没有什么问题的!
当局部变量和全局变量同名的时候,局部变量优先使用。
作用域 作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用
- 的而限定这个名字的可用性的代码范围就是这个名字的作用域。
- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
生命周期 变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
(我将用我自己的理解通俗讲解如果大家觉得不准确可以自行百度,搜索最精确的解释)
就是一串数据
具有常量属性的变量
就是相当于一个数字赋予一个名字
系统会初始化他的大小从1开始依次递增1,如果自定义一个大小后面没自定义的大小依旧按照递增1的规则往下
#include
//举例
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pai = 3.14f; //这里的pai是const修饰的常变量
pai = 5.14;//是不能直接修改的!
//#define的标识符常量 演示
#define MAX 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的
return 0;
}
(定义太复杂了,我用自己理解解释)
就是相当于一段话,“”引号里面就是说话内容,引号里面是键盘上的所有字符组成的,当然也可以是中文
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
下面是字符串的定义与输出,字符串一般是用字符数组定义,因为字符串是多个字符组合起来的,输出是**%s**
#include
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
char arr1[] = "bit";
char arr2[] = { 'b', 'i', 't' };
char arr3[] = { 'b', 'i', 't','\0' };
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
从这一段代码的运行结果就能看出来第二个没有加‘\0’输出了一堆乱码,那是因为不到结束标志就一直输出了后面计算机存储的内容,第一种定义不需要加‘\0’自动带有。
转义字符 释义
\? 在书写连续多个问号时使用,防止他们被解析成三字母词
\' 用于表示字符常量'
\“ 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a 警告字符,蜂鸣
b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd d d d表示1~3个八进制的数字。 如: \130 表示字符X
\xdd d d 表示2个十六进制数字。 如: \x30 表示字符0
注:
\ddd: ddd表示1-3个八进制的数字。将ddd三个数字转换成十进制,十进制数对应的ASCAII就是结果。
dd表示2个十六进制的数字。将dd转换成十进制,十进制数对应的ASCAII就是结果。
(如果看不懂官方解释,通俗就是数字代替字符)
这里给大家留一个思考题,在文章最后我会开启一个投票,如果你能坚持到那就泰裤辣!!!!
这就是选择!
//程序输出什么?
#include
int main()
{
printf("%d\n", strlen("abcdef"));
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
(相当于生活中用到的便利贴)
单行注释 //xxxxxx
2.多行注释内容 /xxxxxx/
C语言有选择结构和循环结构我们先介绍选择结构
选择结构就是我们常说的因果;
接下来我们用代码实现这张图
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main() {
char ch[] = "";
scanf("%s", ch);
if (strcmp(ch, "好好学习") == 0) {
printf("好offer");
}
else if (strcmp(ch ,"不好好学习")==0) {
printf("烤地瓜");
}
return 0;
}
就是持续做一件事然后有一个限制条件,不满足限制条件就跳出循环
依旧是代码实现循环
经典九九乘法表
int main() {
//在屏幕上输出9 * 9乘法口诀表
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
int sum = i * j;
printf("%d*%d=%d ", i, j, sum);
}
printf("\n");
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include ;
返回值 方法名(形参){
函数所要实现的作用
return 返回值(和上面返回值类型一样);
}
int main() {
方法名(实参);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include ;
int Max(int a, int b) {
int sum = a > b ? a : b;
return sum;
}//函数体
int main() {
int a = 0;;
int b = 0;
scanf_s("%d %d", &a, &b);
printf("%d",Max(a,b));
return 0;
}
函数特点:提高代码复用率,清晰明了;
1、一维数组,声明时数组名称前面的类型是数组元素的类型。
2、二维数组,可以作为种表格,它有行有列。
3、字符数组,c语言中没有字符串的概念只有单个字符,所以称一串字符串为字符数组。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main() {
//一维数组
int arr[] = { 1,2,3,4 };
//字符数组
char ch[] = { '1','2','3','4'};
//二维数组
int arr1[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
printf("一维数组");
for (int i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}
printf("\n");
printf("字符数组");
for (int i = 0; i < 4; i++) {
printf("%d ", arr[i]);
}printf("\n");
printf("二维数组\n");
for (int i = 0; i < 3; i++) {
for (int n = 0; n < 3; n++) {
printf("%d ", arr1[i][n]);
}
printf("\n");
}
}
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
“+‘’ , “ -”, “ * ", “%d”
除了‘%’,其他操作符均可以作用于整数与浮点数。
‘/’如果两边的操作数均为整数,则结果为整数,有浮点数操作数则结果为浮点数。
‘%’两边的操作数均要为整数
“>>”,“<<”
& ^ |
位移操作符只能作用于整数
= ,+=, -=, *=, /=, &=, ^=, |=, >>=, <<=
int a=0;
//!a=0,就是相反操作,1为真!1就是假
就是数学里面的对数字进行加减运算的操作符
取地址就是得到储存在内存中的地址
int main()
{
int a = 0;
short b = 2;
printf("%d\n", sizeof(b = a + 2));
printf("%d", b);
return 0;
}
将一个整数的二进制位进行取反,不区分符号位统统进行取反处理
就是自增1,自减1,多用在循环里面
#include
int main() {
for (int i = 0; i < 100; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 100; i > 0; i--) {
printf("%d ", i);
}
return 0;
}
最后一个我们最后指针在细讲;
意思是exp1为真执行exp1,为假则执行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
(这里我先介绍几个常见的,博主以后会细讲)
//将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是用来修饰变量和函数的
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
//将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;
}
//代码1
#include
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
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;
}
对比代码1和代码2的效果理解static修饰局部变量的意义。
结论:
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在编译的时候会出现连接性错误。
结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
用。
与static修饰全局变量一样,只能在本文件使用,不能在其他源文件使用
/define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include
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个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地
址。
简单来说指针就是定义内存中地址的值
//取出变量地址如下:
#include
int main()
{
int num = 10;
#//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}
那地址如何存储,需要定义指针变量。
int num = 10;
int *p;//p为一个整形指针变量
p = #
#include
int main()
{
int num = 10;
int *p = #
*p = 20;
return 0;
}
#include
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
这里只能使用结构体来描述了。
例如:
//结构体的初始化:
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
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语言进阶文章,希望大家能够多多支持