初始c语言

C语言入门

可以对C语言有一个基本的认识,有一些基础的知识。

什么是C语言

C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。 尽管C 语言是与 UNIX 操作系统一起被开发出来的,但它不只支持UNIX。C是一种通用(广泛可用)的编程语言。
程序设计语言实与编译器是一体的,C编译器有著名的GCC(GNU Compiler Collection)等。
广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。 [1]
最新的C语言标准是C23 。

通俗一点来说就是C语言就是人和计算机进行交流的语言。C语言是一种编译性的语言。
我们需要将一个test.c经过编译–链接,然后生成可执行程序-test.exe,文章末尾会进行仔细说明。

第一个C语言程序

本人写代码所用是VS2022。
1.首先打开VS,点击创建新项目。
请添加图片描述

2.点击一下空项目,然后点击下一步。
请添加图片描述

3.这里本人使用的是test后面跟上今天的日期,当然大家也可以根据自己的命名习惯,只要是方便自己的代码查找就行。
这里的位置我推荐大家可以创建一个文件夹进行代码的管理,可以养成一个好习惯,方便我们代码的管理及总结。
请添加图片描述

4.点击创建之后进来是这个画面,如果左侧没有解决方案资源管理器的话,就点击一下上面的视图,点击视图之后的第一个就是解决方案资源管理器了。请添加图片描述

5.在左边的解决方案下的几个黄色的东西,鼠标右键一下源文件,然后会出来一个添加,点击添加,又会出来几个选项,这个时候点击新建项,就会出现如下图示,这个时候我们点击一下上面的C++文件(.cpp),注意此时下面的名称后面.后面的cpp要改成c,如果写的是c++的代码的话就不需要改。前面的那个源字可以随便改(但在这里本人推荐一种命名方法,就是见名知意,有利于养成我们的好习惯。)请添加图片描述

6.创建之后就是这个样子。接下来就可以进行我们代码的编写了。请添加图片描述

程序员的第一个代码

#include <stdio.h>//头文件,里面包含了输入输出函数以及封装的其他函数,需要引一下有文件
int main()//c语言代码中一定要有main函数,程序开始的起点,main函数前面的int就是返回值类型,后面()里面是参数,这里可以里面为void,为空。后面函数会说明。
{   //main函数有且只有一个
	printf("Hello World!\n");//\n在这里起换行的作用
	return 0;//return是返回 后面是返回的东西,这里是0,是一个整数
}
//{}里面的是代码块

程序显示的现象图为
请添加图片描述

数据类型

请添加图片描述
请添加图片描述

这里需要注意一下不同的操作系统可能大小会不一样,还有我们VS2022上面,可以选择是X86还是X64,X86就是32位的,X64就是64位的,这个大家可以自行选择一下。
请添加图片描述
VS的可以在上面这张图上面更改一下是64位还是32位的。
当下演示的是64位下的类型所占字节。
请添加图片描述
接下来演示32位下的类型所占字节。
请添加图片描述
大家可以观察一下打印32位和64位的格式。
32位下用的是%lu,64位下用的是%llu。
sizeof返回的是一个size_t类型的,本质上是一个unsigned int类型的,是一个无符号整型的类型,32位和64位下有一点区别,大家注意一下。

变量·常量

变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。

1.变量的名称可以由字母、数字和下划线字符组成。
2.它必须以字母或下划线开头。
3.大写字母和小写字母是不同的,因为 C 是大小写敏感的。

C语言中的变量的定义

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。可以理解为一个可变的存储器,这个存储器里面的值是可读可写的。我们也可以得到它的地址。

int age;
float salary;
char grade;
int *ptr;
int  i, j, k;

这里展示的如何对一个变量进行定义。在这里大家可以自己定义一下(变量的名字可以自己起,但还是推荐见名知意),并打印一下这个变量目前的值,可以尝试的打印几次,看看几次打印的值是否是同一个。

回答一下上面的问题,几次打印的值应该是不一样。这是为什么呢?

这是因为在变量定义的时候会开辟一块空间,但是这里面的值是我们不知道的,所以是随机值,(猜测可能是上一次使用这块地址遗留下的值,然后正好被我们读取了。)这里也有可能编译器只能报错,不让你执行变量不初始化的代码。这也是因为我们现在使用的VS集成的太好了,不容许出现这种错误。

变量的初始化

int x;          // 整型变量x定义
x = 20;         // 变量x初始化为20
float pi;       // 浮点型变量pi定义
pi = 3.14159;   // 变量pi初始化为3.14159
char ch;        // 字符型变量ch定义
ch = 'B';       // 变量ch初始化为字符'B'

也可以

int x = 20;                // 整型变量x定义并且变量x初始化为20
float pi = 3.14159f;       // 浮点型变量pi定义并且变量pi初始化为3.14159
char ch = 'B';             // 字符型变量ch定义并且变量ch初始化为字符'B'
//这里的float类型初始化时,要在后面加一个f,要不然编译器就会自动默认这是一个double类型的

变量不初始化

在 C 语言中,如果变量没有显式初始化,那么它的默认值将取决于该变量的类型和其所在的作用域。
对于全局变量和静态变量(在函数内部定义的静态变量和在函数外部定义的全局变量),它们的默认初始值为零。
以下是不同类型的变量在没有显式初始化时的默认值:
整型变量(int、short、long等):默认值为0。
浮点型变量(float、double等):默认值为0.0。
字符型变量(char):默认值为’\0’,即空字符。
指针变量:默认值为NULL,表示指针不指向任何有效的内存地址。
数组、结构体、联合等复合类型的变量:它们的元素或成员将按照相应的规则进行默认初始化,这可能包括对元素递归应用默认规则。
需要注意的是,局部变量(在函数内部定义的非静态变量)不会自动初始化为默认值,它们的初始值是未定义的(包含垃圾值)。因此,在使用局部变量之前,应该显式地为其赋予一个初始值。
总结起来,C 语言中变量的默认值取决于其类型和作用域。全局变量和静态变量的默认值为 0,字符型变量的默认值为 \0,指针变量的默认值为 NULL,而局部变量没有默认值,其初始值是未定义的。

字符串·转义字符·注释

字符串

在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

在这里可以把字符串放到一个数组里面,数组后面会详细讲解,大家现在可以理解为数组是一个存放相同类型的一个存储器。
请添加图片描述

上面的图示是我打开了调试功能,可以观察一下数组里面存放的都是什么,关于调试快捷键是Ctrl键+F10,就可以打开调试窗口了,点击F10是逐过程走,F11是逐语句走,在这举个栗子,假如说下一步走的是函数,如果按一下F10是跳过函数,直接把函数里面的代码执行一遍了,如果按一下F11是进入函数。

char str[] = "abcdef";    //初始化

请添加图片描述

#include <stdio.h>  //引头文件
#include <string.h>		//里面包含strlen函数,求字符串长度
int main()
{
	char str[] = "abcdef";
	int len1 = strlen(str);		//使用strlen函数,需要引string.h,用于计算字符串的大小
	int len2 = sizeof(str);		
	printf("%d\n", len1);	//6
	printf("%lu\n", len2);	//7
	return 0;
}

由上面的例子可以看出,我们要求出字符串的长度,显然用strlen求出的是正确的,而用sizeof求出的确是在strlen求出的基础上面+1,这是因为用sizeof求字符串长度会把结尾的\0也计算下来,所以比用strlen求出的大1。

转义字符
请添加图片描述

这是一些我们写代码可能会遇到的转义字符,我们不需要刻意的死记硬背,我们有的用的多了,就记住了,当然遇到实在不会的就查一下。

例子

请添加图片描述
请添加图片描述

这样我们可以很直观的看出转义字符的作用了。

注释

1.代码里面有不需要的代码可以选择直接删除,也可以选择注释。
2.代码里面可能有些代码比较难懂,这个时候我们就可以加一些注释文字。

请添加图片描述

	int a = 10;  //定义了一个变量并且为其初始化为10
	int* p = NULL;	//定义了一个int*的指针并且初始化为NULL(空)

	//int b = 0;
	/*
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	int f = 0;
	*/

由上面的可以总结为

1.单行注释用 //
2.多行注释用 /* */

在VS上面还有一个按键

请添加图片描述

红色箭头所指的是你选中的几行代码进行注释。
蓝色箭头所指的是你选中的几行代码进行解注释。

大家可以按照自己喜欢的方式进行注释。

选择语句

if…else…语句

请添加图片描述
上图所示的True为真,False为假。

请添加图片描述

如果想划分的更细的话还可以这样写。

请添加图片描述

对if…else…语句的一个更细的划分,当然中间可以划分很多层。

switch语句

请添加图片描述

这里总结一下注意的事项,case后面跟的必须是常量表达式,每个case后面的break在上述例子上面必须要加。大家也可以自行尝试一下不加会出现什么情况。这些内容会在后面更新。最后一句default大家可以选择性的加,是可有可无的。

循环语句

请添加图片描述
这里先跟大家简单介绍一下3中循环语句。
1.for循环

请添加图片描述

请添加图片描述
可以看出上述两个代码打印结果是一样的。

也可以看出循环语句可以帮我们做一些重复的事情。

请添加图片描述

红色箭头所指是对 i 进行了初始化。
黄色箭头所指是对 i 当前判断了一下是否满足条件。
蓝色箭头所指是对 i 进行了自增。如果不自增的话,循环就会成为死循环。

请添加图片描述
大家这样写也可以。

2.while循环

请添加图片描述

大家学习的时候也可以跟上面的for循环进行一下对比,在很多情况下for循环和while循环可以通用,在解决一些问题上面。

3.do…while循环

请添加图片描述

这里需要说一下就是while和do…while循环的区别。

while循环是先判断条件,看是否满足,满足就进去,不满足就不进行,所以进去次数最小是0。
do…while循环是先进入循环,不用管是否满足条件,在循环里面执行一次之后,在进行条件的判断,所以进去次数最小是1。

函数

大家最熟悉的函数莫过于我们经常敲得main函数了。

函数的定义

int Add(int x, int y)
{
	int n = 0;
	n = x + y;
	return n;
}

请添加图片描述

黄色箭头所指的是函数的返回值类型,这个类型和return后面的n必须要是同一个类型。
蓝色箭头所指的是形参x,类型是int整型的。
绿色箭头所指的是形参y,类型是int整型的。
红色箭头所指的是你要返回的东西,类型必须要和函数的返回值类型一致。
Add就是函数名,{}里面所指的是函数体。

函数的声明

函数声明会告诉编译器函数名称及如何调用函数。

#include <stdio.h>
int Add(int x, int y);		//函数的声明,注意在声明后面必须要加分号,并且在main前面,要不然不一定找得到。
int main()
{
	int a = 2;
	int b = 3;
	int c = Add(2, 3);		//函数调用 返回的数是一个int类型的,我们也用一个int类型的去接收。
	printf("%d\n", c);
	return 0;
}
int Add(int x, int y)		//函数的实现
{
	int n = 0;
	n = x + y;
	return n;
}

以上说的是函数的传值调用以及简单定义。

数组

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
可以认为数组是一些相同类型元素的集合。

请添加图片描述

我们可以通过下标索引的方式进行对数组里面的元素进行查找及一些列操作。

请添加图片描述

请添加图片描述

由上面的两幅图可以看出,arr【】里面如果填入一个值,就会根据这个值来经过一系列计算给出所占的内存大小,如果不填入值,编译器就会自动检测数组里面有几个元素,有几个元素就开辟几个元素的空间大小。如果填入的值大于后面{}里面的数量,那么多余的就会被初始化为0。

求数组的长度方法

#include <stdio.h>
int main()
{
	int arr[]={1,2,3,4,5,6};
	int sz=sizeof(arr)/sizeof(arr[0]);
	printf("%d\n",sz);
	return 0;
}

遍历数组的方法

#include <stdio.h>
int main()
{
	int arr[]={1,2,3,4,5,6};
	int sz=sizeof(arr)/sizeof(arr[0]);
	int i=0;
	for(i=0;i<sz;i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

这里也可以用while循环,这个看大家的习惯。

代码如下

#include <stdio.h>
int main()
{
	int arr[]={1,2,3,4,5,6};
	int sz=sizeof(arr)/sizeof(arr[0]);
	int i=0;
	while(i < sz)
	{
		printf("%d\n",arr[i]);
		i++;
	}
	return 0;
}

操作符

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

一般都用作判断条件。

请添加图片描述
初学者特别注意=和==

=是赋值运算符
= =是关系运算符。
两者的使用方式不同,如果在判断条件里面写入=而不是==就有可能会陷入死循环。

请添加图片描述

这里都是我们经常会用到的一些运算符,在这里说一下三目运算符。

请添加图片描述

a>b?a:b
可以分为以下几个步骤。

if(a > b)
{
	return a;
}
else
{
	return b;
}

请添加图片描述

优先级对我们来说是挺重要的,我们写代码的时候也会遇到因为优先性弄错而代码现象不对的情况。

请添加图片描述

这里可以直观的看出前置++和后置++的区别。

前置++是先把变量a+1,然后在使用,在这里可以理解为打印。
后置++是先使用,也就是先打印,在进行变量a+1。

所以大家在使用前置++和后置++的时候注意一下。还有前置–和后置–是一样的道理。

常见的关键字

32个关键字,注意我们命名的时候不能和关键字重名。

请添加图片描述

define定义常量和宏

请添加图片描述
上述是把里面所有的MAX都换成100。

#define PI 3.1415926   把程序中出现的PI全部换成3.1415926	//define定义常量

#define ADD(x,y) ((x)+(y))   //define定义宏

不管是常量还是宏,都会完成替换操作。

指针

指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

指针存放的是地址,所以指针的大小是固定的,不管存储是的int,double,long long类型都是一样的,在32位下指针大小是4个字节,在64位下指针大小是8个字节。

32位下:
请添加图片描述

64位下:
请添加图片描述

请添加图片描述

int var_runoob = 10;  //定义一个变量并且初始化为0,在内存上的地址是0x7ffeeaae08d8
int* p;		//定义一个int* 类型的p指针,在内存上的地址是0x7fff5cc109de
p = &var_runoob;	//&取出变量的地址赋给了p,即p指向了这块地址,p现在存放的就是变量的地址。注意不要把p本身的地址和p存放的地址搞混了。
int* p=NULL;  //我们在定义指针的时候最好是初始化,如果不初始化会有很多的问题。如果不初始化,p就会随机指向内存里的一块地址,这种操作是非常危险的。

指针的解引用操作

	int a = 10;
	int* p = &a;
	printf("%d\n", *p);		//打印结果为10

	*p = 20;
	printf("%d\n",a);		//打印结果是20,可以说明指针可以通过地址去找到a的值并且去修改它。

指针遍历数组的方法

	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;		//数组名就是首元素地址,地址就可以用指针来进行接收
	for (int i = 0; i < sz; i++)
	{
		printf("%d\n", *(p + i));	//p+1就是跳过一个元素,然后解引用,就可以得到下标为1的元素。
	}

结构体

C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。

总结
结构体是把一些单一类型组合在一起的做法。

#include <stdio.h>
struct Student
{
	//下面的都是成员
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};
void print(struct Student* PS)
{
	//这里的PS是一个结构体指针,指针访问成员变量的时候我们用PS->后面跟上成员变量的名字即可访问。
	printf("%s %d %s %s\n",PS->name,PS->age,PS->sex,PS->tele);
}
int main()
{
	struct Student S={"李四",18,"nan","156782122"};		//对结构体里面的成员进行初始化
	//printf("%s %d %s %s\n",S.name,S.age,S.sex,S.tele);		//打印结构体里面的成员变量,我们用S.后面跟成员名来访问相对应的成员。
	print(&S);		//把结构体的地址传过去了
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值