C语言基础(1)—基本内容

C语言程序的结构

总体上,可以概括为注释+include+函数,注释是为了让读者和编写程序徐的人有更好的理解,一眼就能知道该程序是用来干什么的,include是用来调用外部代码的,因为C语言十分有限,所以需要借助外力来实现代码,函数部分则是代码的运行部分,而main()函数(主函数)又是所有代码的起点。

main()函数

因为main()函数十分重要,所以我们在这里单独的把他拿出来讨论一下,首先,main()函数的返回值是int,返回值是什么呢、为什么要用它呢,计算机在运行我们所写的程序时,需要通过一些手段来来判断程序是否运行成功,而计算机就是用我们的返回值来判断,如果返回值为0则成功运行,其他的数值都是运行失败。在这里插入图片描述

其他语句块

while循环,只要while的判断条件是真,就会一直循环下去;和while相似的do-while循环则是先执行一次再进行条件判断,无论是否符合条件都会执行一次;同样属于循环的还有for循环,for循环的基本构成是变量名+循环条件+循环增量,在一些情况中,用for循环可以更加简洁;如果想要跳出循环,可以用break和continue,break是在任意时刻跳出循环,continue是随时跳到循环条件处;在语句的最后,要看是否设置return,若先前是void则不需要,int则需要。

C语言的运行

知道了C语言的基本结构之后,我们就要了解一些关于C语言的程序的运行的原理,将C语言这一编译型语言转化为机器能读懂的机器语言的过程就是编译,这里面运用到了一个东西叫编译器,目前来说最流行的C编译器之一就是gcc,gcc编译的过程如下,首先代码被保存在.c文件中,之后再在命令提示符或者终端使用gcc name.c -o name命令进行编译,然后继续在命令提示符或终端中,使用./name运行程序。 同时这里也有个小技巧来实现编译并运行,gcc name.c -o name && ./name在Windows命令提示符中需要gcc name.c -o name && name而非./name

在这里插入图片描述
这里面又有一个小问题,为什么Linux和MAC中需要./来执行程序而Windows不用,原因很简单,因为Linux和MAC属于类Unix系统,在此系统中,执行程序需要知道详细的路径,指明该程序的目录地址,除非将其安排在PATH环境变量中;如果还没懂没有关系,先来谈谈PATH环境变量,该变量的主要作用是让系统快速启动一个应用程序,不需要详细的路径,若非在该环境中,则需要如图一一样得输入详细的路径;而如果将他添加到环境变量中,就只需要应用名就可以执行该程序,非常的方便简洁。

在这里插入图片描述
在这里插入图片描述

存储器和指针

C语言在如何使用存储器方面赋予了你更多的掌控权,掌握指针和存储器寻址对一名地道的C程序员来讲是十分重要的。

基本理解

首先,先要知道什么是指针,指针就是存储器中某条数据的地址,使用指针的最大母的就是为了方便简单,直接明了减少一系列的麻烦,接下来谈谈跟指针密切相关的存储器,当声明一个变量时,计算机就在存储器的某个地方为它创建空间。如果在函数(例如main()函数)中声明变量,计算机会把它保存在一个叫栈(Stack)的存储器区段中;如果你在函数以外的地方声明变量,计算机则会把它保存在存储器的全局量段(Globals)。

在这里插入图片描述
为了便于理解,利用一个小程序的编写来加以阐释,现需要编写一个程序来控制船的航向控制,在这里插入图片描述
为了方便编写,和后期维护,我们需要创建许多小的函数,让每个函数实现游戏的一个功能,以向一个方向前进为例,go_south_east()函数是用来向东南移动的,但如果如下图这样写,能否正确运行呢,可以检验一下。

在这里插入图片描述
而错误的原因在于参数传递的错误,传递的知识变量的值,而不是变量本身,所以最后得到的只是原来的数值,但如果使用了指针,将地址作为变量传递再进行输出,就可以成功了。
如果想要存储器和指针结合起来,用指针来读写数据,需要做三件事,首先是得到地址,再是读取地址里面的内容,最后是改变地址的内容,&运算符可以找到变量的地址。 *运算符可以读取存储器地址中的内容。*运算符还可以设置存储器地址
中的内容,了解了这些内容之后我们就可以这样修改我们的错误的程序了。

在这里插入图片描述

tips:数组变量可以被用作指针。 数组变量指向数组中第一个元素。 如果把函数参数声明为数组,它会被当作指针处理。 sizeof运算符返回某条数据占用空间的大小。 也可以对某种数据类型使用sizeof,例如sizeof(int)。sizeof(指针)在32位操作系统中返回4,在64位操作系统中返回8。

指针类型

既然指针只是地址,为什么指针变量有类型?为什么不能用一种通用类型的变量保存所有的指针?因为指针算术运算会暗渡陈仓。如果对char指针加1,指针会指向
存储器中下一个地址,那是因为char就占1字节。如果是int指针呢?int通常占4字节,如果对int指针加1,编译后的代码就会对存储器地址加4。在这里插入图片描述

输入方式

除了我们常见的scanf输入以外,还可以用fgets(),大多数初学者并没有使用过,fgets和scanf的区别在于,fgets接受char类型的指针,需要给出最大长度,同时也不需要像scanf一样把长度减一,因为fgets()将缓冲区的\0算进去了,为了方便,通常配合sizeof使用

在这里插入图片描述
如果我们拿scanf和fgets进行对比,可以发现区别如下,fgets和scanf都有显著的优势
在这里插入图片描述
所以可以总结为:如果需要输入由多个字段构成的结构化数据,可以使用scanf();而如果想要输入一个非结构化的字符串,fgets()将是你的不二之选。

字符串

我们都知道在C语言中字符串其实就是char数组,string.h是C标准库的一员,它负责处理字符串。如果想要连接、比较或复制字符串,string.h中的函数就可以派上用场了。接下来笔者将谈谈如何创建字符串数组,并近距离观察如何使用strstr()函数搜索字符串。
当安装C编译器时可以免费得到一批很有用的代码——C
标准库。标准库中的代码能做很多有用的事情,例如打开
文件、做算术以及管理存储器,但不可能一次用到整个标
准库,因此标准库分了好几个部分,每个部分都有一个头
文件,列出了这部分标准库中的所有函数。
到目前为止,你只用过stdio.h头文件。stdio.h提供了标准输入/输出函数,如printf和scanf。标准库也含有处理字符串的代码。很多程序都需要处理字符串,而标准库中用来处理字符串的代码不但久经考验、稳定可靠,速度还很快。
#include <stdio.h>
#include <string.h>
你可以用string.h头文件把处理字符串的代码包含到程序中,把string.h加在程序的顶端,就像你包含stdio.h那样,下图是string.h库中我们常用的一些函数

在这里插入图片描述

strstr()函数

strstr是用来在字符串中查找字符的函数,如果我们想在一个长字符“dysfunctional”中找字符串“fun”,你可以像这
样调用strstr():

strstr("dysfunctional", "fun")

strstr()函数会在第一个字符串中查找第二个字符串,如果找到,它会返回第二个字符串在存储器中的位置,在这个例子中,函数会发现fun子串从存储器4 000 003号单元开始。如果找不到,strstr()就会返回0值。为什么要返回0呢?如果你还记得,就知道C语言中0就相当于假,也就是说,可以用strstr()检查一个字符串
是否存在于另一个字符串中,像这样:

char s0[] = "dysfunctional";
char s1[] = "fun";
if (strstr(s0, s1))
 puts("我在dysfunctional中找到fun了!");
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值