初识C语言(下)

news2024/9/23 15:24:24

写在前面

好了,现在我们开始C语言的第二个部分.今天我们需要看下面几个知识点,都是非常简单的,我们主要认识一下.

数组

我们知道一个一个属性可以用一个类型去表示,那么我想问的是如果是一个属性的多个呢?也就是多个一样的东西,此时我们就要使用数组来进行表示,所谓的数组就是存储数据的容器,保证多个数据的数据类型要一致,C语言中给了数组的定义:一组相同类型元素的集合.

数组使用

我们想要存储1~10这几个数据我们应该如何存储?很简单.

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素

数组访问

注意了,如果我们没有在[]中具体元素的个数,那么我们实际存储元素的个数按照后面初始化的个数来进行计算,如果给了实际元素的个数,那么我们后面最多存储元素就是规定的元素个数.我们如果访问数组的元素,那么我们就要依赖数组的下标,记住数组的下标是从0开始的,这一点非常重要.

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;
}

image-20230121231532289

函数

所谓的函数我们可以称之为是代码的功能的集合,我们把程序不同的功能写成一个个函数,这样我们后面是可以再其他地方重复调用的.其中main函数也是一个函数.函数的基本结构是

放回置 函数名(参数列表)
{
    函数体
}

我们来实现一个打印1-10的函数.

void Print()
{
	for (int i = 0; i < 10; i++)
	{
		printf("%d ",i+1); // ??)--]-三字母词
	}
}

我们调用函数只需要用函数名和相关的参数就可以了.

int main()
{
	Print();
	return 0;
}

image-20230122181554543

字符串

在C语言中用一对"“括起来的字符我们称之为字符串,就像"hello world”.注意我们C语言是没有字符串类型的,大家不要搞错了就行.

在C语言中字符串的末尾其实隐藏着一个’\0’;y也就是只要你使用双引号输入一个字符串,它的末尾就是自动携带一个’\0’来作为字符串的结束标志,实际在内存中,上面的字符串是这样的“hello world\0"末尾带了一个’\0’来作为结束标志.我们验证一下.

#include <stdio.h>
int main()
{
	char * str = "hello world";

	return 0;
}

image-20230121222350063

上面我们验证的还是不太清楚,这里我们再次看一个现象.

#include <stdio.h>
int main()
{
	char arr1[] = { 'a', 'b', 'c', 'd' };
	char arr2[] = { 'a', 'b', 'c', 'd','\0' };
	char* arr3 = "abcd";
	printf("arr1 %s\n", arr1);
	printf("arr2 %s\n", arr2);
	printf("arr3 %s\n", arr3);
	return 0;
}

image-20230121222652455

也就是所谓的字符串我们可以这样认为,我们可以认为他们是字符数组,但是字符数组最后我们一定要带上一个’\0’,注意我们是这么理解,实质肯定有所不同,我们先不谈,这涉及到其他的内容.

strlen && sizeof

我们谈到字符串和字符数组我们就不得不说一下strlen和sizeof得区别了,记住了它最大得一个区别,sizeof是关键字,strlen是函数,这是本质得不同.在功能呢上,sizeof计算是我们数组开辟得空间,它的单位是字节,strlen是计算有效字符的个数,所谓的有效字符是指’\0’之前的都是有效字符.

sizeof

我们先来测试一下sizeof关键字.

int main()
{
	char arr1[] = { 'a', 'b', 'c', 'd' };
	char arr2[] = { 'a', 'b', 'c', 'd', '\0' };
	char arr3[10] = { 'a', 'b', 'c', 'd', '\0' };
	printf("arr1 %d\n", sizeof(arr1));
	printf("arr2 %d\n", sizeof(arr2));
	printf("arr3 %d\n", sizeof(arr3));

	return 0;
}

image-20230121223732805

这个我们已经知道了,那么我们这里在和大家说一下sizeof的的用法,我们sizeof既可以计算类型的大小,也可以计算变量占据空间的大小.

int main()
{
	int a = 0;
	printf("int %d\n", sizeof(int));
	printf("a %d\n", sizeof(a));
	return 0;
}

image-20230121224130905

但是我们计算类型和计算变量是有一点区别的,计算变量我们可以不带括号.

int main()
{
	int a = 0;

	printf("a %d\n", sizeof a);

	return 0;
}

image-20230121224412513

但是我们参数是类型的时候我们必须带上括号.

int main()
{
	int a = 0;

    printf("int %d\n", sizeof int);

	return 0;
}

image-20230121224316251

strlen

下面我们开始用一下strlen函数,这个是在标准库string.h中的,我们使用前需要引入头文件.strlen函数就是为了寻找字符’\0’,知道知道’\0’,否则我们会一直计数.

int main()
{
	char arr1[] = { 'a', 'b', 'c', 'd' };
	char arr2[] = { 'a', 'b', 'c', 'd', '\0' };
	char* arr3 = "abcd";
	printf("arr1 %d\n", strlen(arr1));
	printf("arr2 %d\n", strlen(arr2));
	printf("arr3 %d\n", strlen(arr3));

	return 0;
}

image-20230121224758530

转义字符

假如我们要在屏幕上打印一个目录:c:\code\test.c.我们该如何写代码,是不是按部就班的直接复制粘贴.看一下现象.

int main()
{
	
	printf("%s\n", "c:\code\test.c");

	return 0;
}

image-20230121225044027

此时我们就会发现和我们想的有点不太一样.是我们想错了吗?不是的,是大家缺了一个知识点.在C语言中,为了我们数据的打印更加优美,此时添加了很多的转义字符.什么是转义字符,这个就是改变了原本意思的字符.今天我们用一下常见的转义字符.

转义字符说明
?在书写连续多个问号时使用,防止他们被解析成三字母词
\’用于表示字符常量’
\“用于表示一个字符串内部的双引号
\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0

下面我们认识一下三字母词

int main()
{
	printf("(are you ok??)"); // ??)--]-三字母词
	return 0; 
}

image-20230122002929699

在一些老的编译器??)会被解析成],不过现在的编译器一般不这么干了,我们了解就可了.

我们说一下常见的一些转义字符,其余的就不谈了,有兴趣的自己可以查一查验证一下就可以了,很简单的.

  • \\ 如果我们想要打印 字符’\’ ,在\的前面再加一个\就行了
  • \ddd 这里面ddd表示的是3个8进制数,可以使用1-3个8进制数
  • \xdd dd表示的两个十六进制数

下面我们来练习一个习题,我们求一下字符串的长度

#include<stdio.h>
#include <string.h>
int main()
{
	char* str = "c:\test\328\test.c";
	printf("%d\n", strlen(str));
	return 0;
}

image-20230122002804069

这个字符串的长度是4,就是下面的“c : \t e s t \32 8 \t e s t . c”

操作符

这里只是认识,后面的再说吧.

  • 算数操作符: + - * / %
  • 逻辑操作符: && ||
  • 移位操作符: >> <<
  • 赋值操作符: = += -= *= /= &= ^= |= >>= <<=
  • 位操作符: & ^ |
  • 条件操作符: exp1 ? exp2 : exp3
  • 逗号表达式: exp1, exp2, exp3, …expN

下面我们只说一下逗号表达式,所谓的逗号表达式就是我们根据从左到右的规则依次往后面计算,该赋值的赋值,该替换的替换.

int main()
{
	int a = 0;
	(a = 2 * 6, a * 3, a = a + 5);
	printf("a = %d\n", a);
	return 0;
}

image-20230122205216509

选择语句

所谓的选择语句就是我们在众多的选项中选择一个符合调价的,我们这里有下面两个类别.

if else

我们先用一下你就明白了,很简单.

int main()
{
	int coding = 0;
	printf("你会去敲代码吗?(选择1 or 0):>");
	scanf("%d", &coding);
	if (coding == 1)
	{
		printf("坚持,你会有好offer\n");
	}
	else
	{
		printf("放弃,回家卖红薯\n");
	}
	return 0;
}

image-20230121232201474

此时我们就明白了他们的含义,如果我们符合条件,那么我们就执行该条件下的代码.那么我想问一下我们只有这两个个条件吗?不是的,我们也是可以田间else if 的.

int main()
{
	int coding = 0;
	printf("你会去敲代码吗?(选择1 or 0 or -1):>");
	scanf("%d", &coding);
	if (coding == 1)
	{
		printf("坚持,你会有好offer\n");
	}
	else if (coding == -1)
	{
		printf("如果你是百万富翁当我没说话\n");
	}
	else
	{
		printf("放弃,回家卖红薯\n");
	}
	return 0;
}

image-20230121232506722

同时我们else if和else都是可以省略的,只保留if,但是我们绝对不可以只让else或者是else的个数多余if.注意else是和它上面最近的if进行匹配的,这里我就不详细的说了,你一验证就明白了.

switch

除了if else选择之外我们还是有另外的一个语法的,这里也是很简单的.

int main()
{
	int a = 1;
	switch (a)
	{

	case 1:
		printf("%s\n","YES");
		break;
	case 0:
		printf("%s\n", "NO");
		break;
	default:
		printf("%s\n", "选择错误");
		break;
	}
	return 0;
}

image-20230121233449477

  • switch()的括号的内部元素类型 字节<=4的整型(char int byte short)
  • 每一个case后面,除非是特殊业务要求,要带上break;

image-20230121233239985

int main()
{
	int a = 1;
	switch (a)
	{

	case 1:
		printf("%s\n", "YES");
	case 0:
		printf("%s\n", "NO");
	default:
		printf("%s\n", "选择错误");
	}
	return 0;
}

image-20230121233540112

循环语句

我们刚刚说了选择语句,但是这个语句只会执行一次。由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢?这里就需要循环语句了,这里的循环语句三个。

  • for
  • while
  • do while

for

这个格式是for(表达式1; 表达式2; 表达式3),也是很好用的

  • 表达式1 为初始化部分,用于初始化循环变量的。
  • 表达式2 为条件判断部分,用于判断循环时候终止。
  • 表达式3 为调整部分,用于循环条件的调整。
int main()
{
	for (int i = 0; i < 10; i++)
	{

		printf("%d ", (i + 1));
	}
    return 0;
}

image-20230121233758601

这里我们想和大家说一个结论,条件判断部分要比调整部分多上一次,有的选择题会进行考察.

while

我们也是使用它进行打印1-到10的数字,这个也是非常简单的.

int main()
{
	int i = 0;
	while (i<10)
	{

		printf("%d ", (i + 1));
		i++;
	}
	return 0;
}

image-20230121234441906

do while

如果说while语句是先进行条件判断,那么dowhile就是先执行代码,后面再进行条件判断.

int main()
{
	int i = 0;
	do{
		printf("i: %d\n",i);

	} while (i > 0);
	
	return 0;
}

image-20230121234722686

跳出语句

跳出语句算是对循环语句做一个补充,我们知道,任何一个人都有可能再满足一定情况下结束循环,有的人会等到条件完成后结束,有的人可能中途有添加了另外的条件,此时我们下面的两个关键子都是为了他们准备的.

contine

contine关键字是跳出本次循环,继续下一次的循环.

int main()
{
	int i = 0;
	while (i < 10)
	{
        i++;
		if (i == 5)
		{
			continue;
		}
		printf("i: %d\n", i);
		
	}

	return 0;
}

image-20230121235423626

break

break语句更加直接,它是直接结束循环.

int main()
{
	int i = 0;
	while (i < 10)
	{
		i++;
		if (i == 5)
		{
			break;
		}
		printf("i: %d\n", i);

	}

	return 0;
}

image-20230121235521256

指针

下面我们谈C语言最重要的也是最让人难以理解的一个内容,这我们在后面会重点谈.大家记住,所谓的指针我们就认为它是一个地址,它是指向一个事物的标志,这就是指针的简单理解.根据计算机主线的根数不同,指针分为4字节和8字节,其中32为机器是4字节,64位是8字节.

int main()
{

	int a = 10;
	int * p = &a; // p 就是一个指针
	printf("%d\n", sizeof(p));
	return 0;
}

image-20230122211117022

那么我想问的是我们拿到了a的地址,请问我们如何看待a的内容呢?这里可以使用解引用,解引用就是根据地址找到那一片的空间.

int main()
{

	int a = 10;
	int * p = &a;
	printf("a = %d\n", *p);
	*p = 20;
	printf("a = %d\n", a);

	return 0;
}

image-20230122211313961

这里我想和大家说的,任何指针类型的大小只要机器的位数确定,那么我们字节数也就确定了.

struct Student
{
	char name[100]; // 姓名
	char sex[10];// 性别
	int age; // 年龄
};

int main()
{
	printf("char %d\n", sizeof(char*));

	printf("int %d\n", sizeof(int*));
	printf("double %d\n", sizeof(double*));
	printf("struct Student  %d\n", sizeof(struct Student*));
	return 0;
}

image-20230122211826287

自定义类型

上面我们已经知道了自定义类型,也就是int之类的.那么我想问的是如果我们想要描述学生这个属性,我们应该怎么办?此时我们知道用自定义类型是可以描述的,但是我们有点麻烦,这里C语言提供了一个关键字,我们可以使用它来自己定义类型.

struct

这个一个结构体关键字,我们可以这么做.

struct Student
{
	char name[100]; // 姓名
	char sex[10];// 性别
	int age; // 年龄
};

这就是一个结构体,也就是下面的格式

struct 结构体名字
{
    // 成员属性
};

这里我们需要记住的是struct 结构体名字才是结构体的类型,大家不要记混了.这里给大家使用一下.

struct Student
{
	char name[100]; // 姓名
	char sex[10];// 性别
	int age; // 年龄
};
int main()
{

	struct Student stu = { "张三", "男", 18};
	printf("%s %s %d\n", stu.name, stu.sex, stu.age);
	return 0;
}

image-20230122210548231

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

22. 输入和输出

1. 输出格式美化 (1) 如果你希望输出的形式更加多样&#xff0c;可以使用 str.format() 函数来格式化输出值。 (2) 如果你希望将输出的值转成字符串&#xff0c;可以使用 repr() 或 str() 函数来实现。   str()&#xff1a; 函数返回一个用户易读的表达形式。   repr()&am…

产品原型设计方法

产品原型设计方法1. 色彩选择与按钮设计1.1色彩选择1.2 按钮设计2. 使用原型设计中的基础元素2.1 使用文字元素2.2 使用图标元素3. 设计导航菜单栏和卡片式布局3.1设计导航菜单栏4.3 设计卡片式布局4. 使用UI框架4.1 使用UI框架的好处4.2 常用的UI框架1. 色彩选择与按钮设计 1…

K8s:通过 kubectl 插件 Kubepug 实现集群升级检查(废弃API资源检查)

写在前面 分享一个小工具&#xff0c;可用于 版本升级的 废弃 API 对象检查博文内容涉及&#xff1a; kubepug 离线安装&#xff0c;配置 kubectl 插件kubepug 两种方式离线使用 Demo 理解不足小伙伴帮忙指正 昔我往矣&#xff0c;杨柳依依。今我来思&#xff0c;雨雪霏霏。 —…

【HBase入门】1. HBase基础

简介 Hadoop 从 1970 年开始&#xff0c;大多数的公司数据存储和维护使用的是关系型数据库大数据技术出现后&#xff0c;很多拥有海量数据的公司开始选择像Hadoop的方式来存储海量数据Hadoop使用分布式文件系统HDFS来存储海量数据&#xff0c;并使用 MapReduce 来处理。Hadoo…

【Ajax】同源策略、跨域和JSONP

一、同源策略什么是同源如果两个页面的协议&#xff0c;域名和端口都相同&#xff0c;则两个页面具有相同的源。例如&#xff0c;下表给出了相对于 http://www.test.com/index.html 页面的同源检测&#xff08;如果没有写端口号&#xff0c;默认是80&#xff09;&#xff1a;UR…

开篇点睛——Elasticsearch

在互联网当中我们的查询的信息主要包括文章、视频、图片、网站信息等各式各样的复杂海量信息。怎么才能快速、准确的检索到我们想要的信息呢? 传统意义上根据数据的格式&#xff0c;我们会将数据分为三个大类 结构化数据非结构化数据半结构化数据 接下来我们详细的了解一下这…

Day07 - 面向对象

1. 面向对象概述 面向对象是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 面向对象是相对于面向过程来讲的&#xff0c; 面向对象方法 &#xff0c;把相关的数据和方法组织为一个整体来看待&#xff0c;从更高的层次来进行系统建模&a…

开发人员必备的 15 个备忘单

随着网络编程技术的快速发展&#xff0c;我们必须学习很多新东西。有些语言和框架非常复杂&#xff0c;您可能记不住所有的语法或方法。备忘单是易于访问的笔记。当有人在过去目睹任何有帮助或有价值的事情时&#xff0c;包括我自己&#xff0c;我们都会做笔记。但是&#xff0…

Vue 快速入门(四)

前面已经介绍Vue常用指令的基本应用&#xff0c;这篇介绍Vue的一些特殊属性的使用。 01 - 计算属性Computed 计算属性关键词&#xff1a;Computed。 计算属性在处理一些复杂逻辑时是很有用的。 普通的写法 比如字符串反转普通写法&#xff0c;如下&#xff1a; <!DOCTYPE h…

Godot根据遮罩图移动粒子

前言 目前UI粒子特效unity引擎比较多&#xff0c;也好找资料&#xff0c;但是一般都是利用模型&#xff0c;使用3D粒子伪装2D效果。 Godot中也可以做到这一点&#xff0c;并且Godot有专门的2D粒子系统&#xff0c;可以通过一张遮罩图对粒子的位置进行设置。 godot粒子教程 …

nginx学习笔记6(小d课堂)

高并发-服务端缓存前置 我们现在启动了我们的一个jar包。 这次我们的nginx配置文件只保留这个。 我们先更改了它的文件名称。 然后我们现在利用默认的先去复制一份nginx配置文件&#xff1a; 我们这样就初始化完了我们的nginx配置文件。 记得加上我们的分号。 然后我们再重启…

AcWing第87场周赛题解

抱歉&#xff0c;3题只有前2题&#xff0c;第三题投入产出比太低&#xff0c;就不做了 一&#xff0c;移动棋子 4797. 移动棋子 - AcWing题库 题目 难度&#xff1a;简单 思路 直接套dfs模板&#xff0c;起点通过输入时得到&#xff0c;终点&#xff08;3&#xff0c;3&am…

Multiple Dimension Input 处理多维特征的输入

文章目录6、Multiple Dimension Input 处理多维特征的输入6.1 Revision6.2 Diabetes Dataset 糖尿病数据集6.3 Logistic Regression Model 逻辑斯蒂回归模型6.4 Mini-Batch&#xff08;N samples&#xff09;6.5 Neural Network 神经网络6.6 Diabetes Prediction 糖尿病预测6.6…

Exadata存储服务器(又称Exadata存储单元)

存储单元可以说是让Exadata如此大规模普及并且使用效果优异的核心要素。 I/O性能问题始终是Exadata存储或者存储服务器尽力去解决的问题。 Exadata存储服务器概述 Exadata数据库一体机通常预装了3类硬件&#xff1a; 数据库计算节点服务器存储服务器极速的InfiniBand存储交…

离散数学与组合数学-03函数

文章目录离散数学与组合数学-03函数3.1 函数基本概念3.1.1 函数的定义3.1.2 函数举例3.1.3 函数的数量3.1.4 关系与函数的差别3.2函数的类型3.2.1 函数类型3.2.2 函数类型的必要条件3.2.3 函数类型的数学化描述3.2.4 函数类型的证明3.3 函数的运算3.3.1 函数的复合运算3.3.2 函…

统计学习方法 学习笔记(1)统计学习方法及监督学习理论

统计学习方法及监督学习理论1.1.统计学习1.1.1.统计学习的特点1.1.2.统计学习的对象1.1.3.统计学习的目的1.1.4.统计学习的方法1.1.5.统计学习的研究1.1.6.统计学习的重要性1.2.统计学习的分类1.2.1.基本分类1.2.1.1.监督学习1.2.1.2.无监督学习1.2.1.3.强化学习1.2.1.4.半监督…

【HBase入门】2. 集群搭建

安装 上传解压HBase安装包 tar -xvzf hbase-2.1.0.tar.gz -C ../server/ 修改HBase配置文件 hbase-env.sh cd /export/server/hbase-2.1.0/conf vim hbase-env.sh # 第28行 export JAVA_HOME/export/server/jdk1.8.0_241/ export HBASE_MANAGES_ZKfalsehbase-site.xml vim…

【算法】洗牌算法

目录1.概述2.代码实现2.1.暴力法2.2.Fisher-Yates 洗牌算法3.应用本文参考&#xff1a; LeetCode 384. 打乱数组 1.概述 &#xff08;1&#xff09;洗牌算法可以理解为&#xff1a;设计算法来打乱一个没有重复元素的数组 nums&#xff0c;并且打乱后&#xff0c;数组的所有排列…

使用C++实现学委作业管理系统

开发环境学委作业管理系统在 Microsoft Visual Studio 2013 编译器开发的 MFC 项目&#xff0c;计算机使用的系统是 window10。1.2 基本原理与技术要求熟悉文件读写、mfc 基本知识、c 类运用、链表使用、排序算法、Microsoft Visual Studio 2013 编译器的使用。1.3 需求说明学委…

【数据结构】二叉搜索树的实现

目录 一、二叉搜索树的概念 二、二叉搜索树的中序遍历用于排序去重 三、二叉搜索树的查找 1、查找的非递归写法 2、查找的递归写法 四、二叉搜索树的插入 1、插入的非递归写法 2、插入的递归写法 五、二叉搜索树的删除 1、删除的非递归写法 2、删除的递归写法 六、…