【C语言初阶】万字解析,带你0基础快速入门C语言(下)

Hello,这里是君兮,在【C语言初阶】万字解析,带你0基础快速入门C语言(上)中
咱们把注释之前的内容介绍完了,今天我们接着上回的内容把剩下的部分讲完。
废话不多说,让我们一起沉浸在代码的海洋中吧!!!

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发


在这里插入图片描述

前言

没看过上篇的内容记得先去看上篇的内容哦,这里是博客链接:【C语言初阶】万字解析,带你0基础快速入门C语言(上)

  • 全篇思维导图
    在这里插入图片描述

八.选择语句

选择就像是人的一个岔路口.走哪条路都要靠他自己的决策.命运不是机遇,而是选择.

  • 是的,如果你现在好好学习,就比如正在看这篇博客的你们和写这篇博客的我,那么继续下去一定能实现自己的梦想!!
  • 而如果每天碌碌无为过的浑浑噩噩,那就只能被社会选择!!!
  • 这是我写这篇博客时的真实感触,与诸君共勉,不扯远了,接下来我们进入正题。
    画个图让大家理解一下选择语句:
    在这里插入图片描述
  • 这就是选择!!(在此声明不是尬黑原神,博主也是开服老旅行者)
    在这里插入图片描述

if语句

  • 通过一个简单的if语句让大家认识一下它
/判断一个数是否大于1
int main()
{
    
    
	int n = 0;
	scanf("%d", &n);
	if (n > 1)//里面是条件判断,当满足条件时,执行if里的语句
	{
    
    
		printf("%d",n);
	}
	else//当条件不满足,执行else里的语句
	{
    
    
		printf("输入错误\n");
	}
}
  • 还有一种switch case语句由于篇幅原因这里先按下不表,后面会出详细的介绍

九.循环语句

在生活中,有些事情我们要反复做,就像学习,没有日复一日的练习,怎么能做到水滴石穿?
在C语言中,有一种专门用于处理需要反复执行的代码的语句,就是我们接下来要讲的循环语句。

  • 循环语句常见的分为三种:
    在这里插入图片描述
  • 循环语句的基本逻辑
    在这里插入图片描述

while 语句

while(判断条件)

在while的()中表示执行循环语句的判断条件,满足条件,就进入循环,不满足条件直接跳过while语句。
简单示例:

#include <stdio.h>
int main()
{
    
    
  printf("加入mi ha you\n");
  int line = 0;
  while(line<=20000)
 {
    
    
    line++;
    printf("我要继续努力敲代码\n");
 }
  if(line>20000)
    printf("面试成功\n");
  return 0;
}



do while语句

与while语句相同,只不过它先执行,再判断,这里暂时不讲,后面会有具体博客讲解。

for语句

这里也暂时不讲,原因同上。
以下有一篇已经写好的关于for循环的实际应用的博客,里面也有部分对for语句的介绍,感兴趣的可以看看。
链接如下:在C语言中如何打印某个范围中满足某些条件的数(素数,闰年,水仙花数等)


十.函数

什么是函数?

  • 维基百科对函数的定义:子程序。

  • 在计算机科学中,子程序,是一个大型程序中的某部分代码,由一个或者多个语句块组成。他负责完成某项特定的任务,而且较于其他代码,具备相 对的独立性。一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库

常用的函数

库函数

为了支持可移植性和提高程序的效率,C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

  • 很多人可能对咱们之前写的代码有些疑惑,这是什么?
#include <stdio.h>
  • 这就是我们使用的最基本的一个包含库函数的头文件,你所用的scanf,printf等都定义在它里面。
  • 不相信?我们验证一下
    在这里插入图片描述
  • 可见,少了库函数,我们这个程序是无法运行的。
  • 下面提供一个学习库函数的网站:c plus plus
  • 注意:库函数的使用,必须包含#include 对应的头文件

自定义函数

很多时候,有些库函数我们没学过或者不满足我们所需的要求,因此我们就要自己定义一个函数,这就是自定义函数。

  • 这里有可能有人会问:
  • 为啥要定义一个函数啊,我直接在主程序里敲不就好了吗?

定义、封装函数的意义:

在这里插入图片描述

主函数 main

前面已经讲过,这里不做赘述。


十一. 数组

数组的定义

  • C语言中给了数组的定义:一组相同类型元素的集合
    比如:
int arr[10] = {
    
    1,2,3,4,5,6,7,8,9,10};//定义了一个整形数组,最多放10个元素
  • 数组还有char型 浮点型等等,后面会有具体的博客讲解。

数组的下标

  • C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
    数组可以通过下标来访问的。
  • 比如上面定义的arr数组
    在这里插入图片描述

数组的使用

  • 简单介绍一下,后面会有具体博客讲解
//在屏幕上打印1-10
#include <stdio.h>
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;
}


十二.操作符

在这里插入图片描述

  • 先大概给大家看看有哪几种,具体用法后面会有博客细讲的

十三.常见关键字

  • C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。

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

选几个比较有用的讲讲,其他的后面有博客会讲的

1.typedef

  • typedef 顾名思义是类型定义,这里应该理解为类型重命名。
  • typedef的重命名其实和人一样,你可以把它理解为人的小名。比如有一个人叫张三,那么从小家里人可能叫他小三,但是这两种叫法的含义是一样的。
    在这里插入图片描述

举例说明一下:

//将unsigned int 重命名为uint, 所以uint也是一个类型名
typedef unsigned int uint;
int main()
{
    
    
  //观察num1和num2,这两个变量的类型是一样的
  unsigned int num1 = 0;
  uint num2 = 0;
  return 0;
  }
  • typedef的使用目的往往是使我们在编写代码时更加方便,如上面代码,写出uint是不是简单多了?

2.关键字static

  • 在C语言中:static是用来修饰变量和函数的
  • 1. 修饰局部变量—称为静态局部变量
  • 2. 修饰全局变量—称为静态全局变量
  • 3. 修饰函数—称为静态函数

修饰局部变量

//代码1
#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;
}
  • 让我们来对比一下代码1和2的运行结果
    在这里插入图片描述
    在这里插入图片描述
  • 注意:
    这里主函数中的i并没有传进test,它的目的只是让test执行十次。
  • 代码1打印10个1的原因:
    当打印完test中的i时,i由于是局部变量直接被销毁,再下一次执行test时又重新被初始化为0.

结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。


修饰全局变量

int year = 2023;
注意这里的两个year未放在同一个源文件中
int main()
{
    
    
	extern year;//表明变量或者函数是定义在其他其他文件中的
	printf("%d ", year);
	return 0;
}

在这里插入图片描述

  • 同样能运行,但当我们用static修饰一下
    在这里插入图片描述

结论:
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。


修饰函数

  • 与修饰全局变量一样
    一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
  • 这里不再缀叙


十四.#define 定义常量和宏

- define翻译为中文就是定义,在这里我们的#define就是给xxxxx下定义的意思。

define定义标识符常量

>#定义   标识符  内容
>#define name  stuff

如下代码

//define定义标识符常量

#define MAX 1000
int main()
{
    
    
	int a = MAX;
	printf("%d", a);
	return 0;

}



在这里插入图片描述

  • 也有类似typedef的用法
#define x int//用x这个名字代替int

x main()
{
    
    
	x m = 0;
	printf("%d", m);
	return 0;
}

在这里插入图片描述

  • 是不是很神奇呢?

define定义宏

#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏 (define macro)

  • 宏的知识是在C语言进阶中的,我们后面也会讲到,这里只是认识它一下。
    举个例子:
#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.内存及指针定义

讲指针前我们得先知道内存是什么

  • 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的
  • 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节
  • 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

在这里插入图片描述

  • 在C语言中,我们把这个地址就叫我们的指针
  • 有些人可能会问了,这个地址是哪来的,又是怎么编号的呢?该不会是我胡诌的吧?
  • 接下来咱们就讲讲

地址与地址编号的由来

  • 在计算机上,有地址线,其中电线的高低电平的信号,转换为数字信号:1/0
  • 在32(64)位机器,上面有32(64)根地址线
    在这里插入图片描述
  • 二进制,由于有32根地址线,所以一共有2的32次方个字节的空间,也就产生了这么多的编号。
    在这里插入图片描述
  • 这就是地址以及其编号的由来

变量在内存中的存储

  • 变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
#include <stdio.h>
int main()
{
    
    
	int num = 0;
	&num;//取出num的地址
	//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
	printf("%p\n", &num);//打印地址,%p是以地址的形式打印
	return 0;
}

在这里插入图片描述

在这里插入图片描述

  • 那变量的地址如何存储,需要定义指针变量。

2.指针变量

  • 指针变量的意思就是一个存放指针(即地址)的变量
int *p;     //定义一个指针变量P,指向整形变量 
char *p;		// 定义一个指针变量p,指向字符型变量 
float * p; 		// 定义一个指针变量p,指向单精度浮点型变量 
double *p1, *p2;		//定义两个指针变量p1和p2,指向双精度实型变量 

指针变量的应用

#include <stdio.h>
int main()
{
    
    
	int num = 0;
	
	int* pa = &num;把取到的num的地址放到一个指针变量pa里
	printf("%d", *pa);
	return 0;
}

在这里插入图片描述

  • 可见num和*pa两者的结果相同
  • 我们也能通过*pa改变num的值

在这里插入图片描述


3.指针变量的大小

  • 上面我们在内存中讲了内存空间的大小,空间有多大自然就有多大的地址,也就是有多大的指针。
  • 用代码测试一下:
#include <stdio.h>
//指针变量的大小取决于地址的大小
//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;
}

在这里插入图片描述

  • 我的电脑是64位平台,因此指针的大小为8个字节

总结:
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)


十六.结构体

该说恭喜还是总算到了最后一章了呢?结构体的知识对于初学者来说也比较难懂,如果这里讲的太深,对于初学者来言,很容易直接从C语言入门到入土,所以咱们这里也还是只简单介绍一下,等之后有了更多的知识后我会写专门的博客来攻克它。

  • 结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
  • 比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
  • 这里只能使用结构体来描述了。

代码如下

struct stu
{
    
    
	char name[10];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};
int main()
{
    
    
	struct stu s = {
    
     "张三",20,"男","211540239" };
	
	//其中"."为结构成员访问操作符
	printf("%s %d %s %s\n", s.name, s.age, s.sex, s.id);

	struct stu* ps = &s;//把s的地址存放在结构体指针ps里,通过地址指向s中的值
	//->操作符
	printf("name = %s age = %d sex = %s id = %s\n", ps ->name, ps->age, ps->sex, ps -> id);
}

在这里插入图片描述


总结

如果你有耐心能从上篇开始看到这里,那么我相信此刻你一定对C语言有了一个新的认识。
正如我在文章中一直提到的,以上的部分只是基础的介绍,如果你感兴趣的话,后面还会有每一部分的具体介绍博客和C语言进阶的知识。让我们一起努力,共同进步。去实现自己的梦想与抱负吧!!

  • 以上就是今天要将的所有内容了,如果有任何疑问欢迎在评论区提出或者私信我。
  • 写一篇这么长又这么系统的博客真的很艰难,其中我查阅了大量的资料以及自己上手写了数千行代码,博客中出现的所有解释用的图片也都是我手绘的。
  • 制作不易,如果你觉得对你有所帮助的话,请三连支持一下这个努力的新人博主吧

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/syf666250/article/details/131201695