C语言快速入门手册1.开始了
1.1.操作过程
输入如下代码,然后选择菜单“File”下的“Save”子菜单保存,或者简单使用“<Ctrl>+S”快捷键。
图中黄色字样标出各部分信息,代码文件保存之后先编译代码。
命令“clang ce0101.c”指定需要编译的文件“ce0101.c”,没有特别指定的话,都将生成“a.exe”可执行文件。
命令“.\\a.exe”运行程序,该程序功能很简单,就只是输出一个字符串“Hello, World!\\n”。字符串是一个顺序字符集合,可以遍历其单个元素,也可拆分或拼接处理。
输入命令时可以敲键盘上的上下方向键(“↑”、“↓”)来加载历史记录。
1.2.说明
所有的C程序文件都采用“.c”扩展名,每个文件为一个单元。
需要注意的是,Windows环境的文件名不区分大小写,只是习惯地用小写的“.c”扩展名,换成大写不影响运行结果。
井号“#”开头的语句是C语言的预处理语句,在代码真正编译之前生效。上面的“#include”语句是将头文件“stdio.h”包含进来,实际上就是把“stdio.h”的内容直接添加到“ce0101.c”中,然后对合并后的代码(自动生成)进行编译。
“main”函数是可独立运行的C程序的入口,是程序启动时候一开始执行的位置。函数是一个可以多次调用的语句块,而语句块是由一个多个的语句组成的,语句块由左花括号“{” 标志开始,由右花括号“}”标志结束。
C程序是由一个或多个的语句或语句块组成的,语句之间以分号隔开“;”。一行代码可以容纳多个语句,一个语句也可以拆分成多行编写,但为了提高代码可读性的原则,最好还是一行一个语句。
“printf”也是一个函数,它的作用是输出字符串(格式输出)。
函数可以有返回值,本例中的“main”函数返回0,调用的是“return 0;”语句。
1.3.头文件
C语言头文件一般采用“.h”扩展名,但这并不是硬性规定,实际上“.c”、“.x”甚至没有扩展名的头文件也是允许的。
我们把上面的程序稍微修改一下,把“#include <stdio.h>”语句移到“ce0101”(没有扩展名)文件里,然后在“ce0101.c”文件里包含“ce0101”文件,编译运行的结果没有区别。
“ce0101”文件内容:
本例中也可以看出“#include”语句的原理就是把文件内容添加进来,如果被添加的内容又包含了“#include”语句,就需要嵌套添加,以此类推。
1.4.库函数
“printf”是C语言的一个标准库函数,所谓的标准库就是C语言标准要求编译器厂商必须实现的函数组成的函数库。标准库的库函数和头文件是配套的,前面我们看到的“stdio.h”就是标准库里面的一个头文件。这种头文件在用“#include”语句包含的时候,文件名以左尖括号“<”标志开始,以右尖括号“>”标志结束。
前文我们自己定义的头文件“ce0101”以双引号“\””标志开始和结束。
“printf”是一个标准输出(stdout)函数,标准输出函数一般指向屏幕输出,后面还会用到标准输出(stdin)函数,标准输入函数一般指向键盘输入。
库函数的种类非常多,需要在日常实践中积累经验。
1.5.函数返回值
一般函数的返回值可以在调用之后获取,“main”函数的返回值,“PowerShell”提供相应的接口可以获取并显示出来。
命令“$proc = Start-Process .\\a.exe –Wait -PassThru”可以运行“a.exe”程序,把运行的状态结果保存在“$proc”变量,其中就包含“$proc.ExitCode”这个分量,就是“main”函数的返回值。命名“echo”显示之后的变量值,功能类似前文的“printf”库函数。
在运行程序之后,可能希望知道程序运行的结果,这时候就需要“main”函数来返回一个数值。一般地,如果程序运行正常,“main”函数返回0,否则就返回一个非零值。
各位可以把本例中的“return”语句返回值修改一下,然后按照上面的方法执行看看结果会不会有所不同。
1.6.可能出现的错误
如果编译器配置不正确,可能会出现下面的错误:
有可能是环境变量配置问题,运行“$Env:PATH”命令查看:
检查相关文件是否复制到指定的目录:
还要强调一下中文问题,文件、文件夹名称是否是中文,代码里面使用的各种符号(“#”、“{”、“}”等等)是不是全角符号(中文),还有拼写是否正确(经常有人将“main”拼成“mian”)都会引起各种各样的错误。
遇到错误不要慌张,仔细查看错误信息,根据信息推断存在错误的原因,仔细核对每一个步骤是否正确无误,是确保程序正常运行的不二法宝。
同时,遇到错误之后解决问题,积少成多都会成为之后学习工作的宝贵经验。第一个程序涵盖的信息量还是很多的,其实还有一部分没细讲,先消化吸收这些之后再慢慢加大分量。不一定要求一下子全搞明白,多多练习就能孰能生巧。
C语言基础知识:最核心的—指针!知识总结(第一部分)
指针是C语言最重要也是最难理解的部分,它在我们平时的工作中无处不在。
有人说学会了指针,C语言也就学会一半。为什么说指针难。因为指针与数组相结合就涉及数组指针与指针数组。指针与结构体结合就涉及结构体指针。指针与字符结合涉及字符指针。指针与const结合涉及常量指针与指针常量。指针与函数结合涉及函数指针与指针函数,同时也会涉及回调函数。指针和指针结合涉及到二维指针。
作者曾经因为上面的这些问题,困扰了许久。因而在网上找了许多的博客来解答疑惑。这篇文章,我试图将上面的知识点以例子的方式呈现给大家,我相信通过阅读本文,大家会对指针有更深一步的了解。文中涉及的例子均来源于网上。
我们知道,普通的变量存储的是一个值。而指针变量,它存储的也是一个值,只是这是一个特殊的值:它的值是另一个变量的地址。
指针的定义形式如下:
其意思就是name是一个指针,它指向的是一个类型为dataype的地址。
指针存储的是一个地址,如果需要获取这个地址对应的内容,可以通过解引用符*获取:
这里需要注意的一点,也是我以前经常迷惑的一点:定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给一个字符串常量进行初始化。比如:
上面这个代码段说明了一个极为常见的错误:我们声明了这个变量,但从未对它进行初始化,所以没法预测12这个值将存储于什么地方。如果变量是静态的,它会被初始化为0,;如果变量是自动地,它根本不会被初始化。无论哪种情况,声明一个指向整型的指针都不会\”创建\”用于存储整型值的内存空间。
但是, 下面的定义创建了一个字符串常量(为其分配了内存):
始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。
除了上述的定义是对的外,其他的定义都是错误的:
指针 +(-) 整数指针存储的是一个地址,这个地址本质上是一个整数,所以可以加上或减去一个整数。但是它不是普通的加法或减法,指针加上或减去一个整数结果是另一个指针。但是,运算后的指针指向哪里呢?当一个指针和一个整数执行算术运算时,整数在执行加法(减法)运算前会根据合适的大小进行调整。这个\”合适的大小\”就是指针所指向类型的大小,\”调整\”就是把整数值和\”合适的大小\”相乘。
运算结果:
由上面的结果可以看到,当对指针pa,pb,pc进行加1时,实际地址增加的是对应类型的大小。减法也一样。
指针 – 指针
只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针。两个指针相减的结果是两个指针之间的元素个数。比如,如果p1指向array[i]而p2指向array[j],那么p2-p1的值就是j-i的值。如果两个指针所指向的不是同一个数组中的元素,那么它们之间相减的结果是未定义的,也是毫无意义的。
数组指针,它是一个指针,指向的是一个数组。即它存的是一个数组变量的地址。所以这个指针每加一步的步长就是数组的长度。由于它每跨一步都是整个数组,所以又称行数组。
运行结果:
首先,pa是一个数组指针,它首先存的是数组a的首元素的地址,由于数组名也是数组的首地址,所以a, &a, &a[0][0]的地址相同。pa中存的也是这个地址。然后对pa进行解引用,*pa之后得到这个数组,然后(*pa)[i]就是获得这个数组下标为i的元素。
指针数组,它本质上是一个数组,只不过整个数组存的类型是一个指针而已。
运行结果:
在C语言中,表示字符串一般有两种形式,一种是数组的形式,一种是字符指针的形式。
数组形式:
字符指针形式:
虽然上面两种形式都能表示字符串,但是它们还是有些区别的:
存储方式字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串。
存储位置。数组是在内存中开辟了一段空间存放字符串, 是存在栈区。而字符指针是在字面值常量区开辟了一段空间存放字符串,将字符串的首地址付给指针变量str。
赋值方式。对于数组,下面的赋值方式是错误的:
而对字符指针变量,可以采用下面方法赋值:
可否被修改。指针变量指向的字符串内容不能被修改,但指针变量的值(即存放的地址或者指向)是可以被修改的。
来源:稀土掘金,作者:Elec
对啦对啦!另外的话为了帮助大家,轻松,高效学习C语言/C++,我给大家分享我收集的资源,从最零基础开始的教程到C语言项目案例,帮助大家在学习C语言的道路上披荆斩棘!可以来我粉丝群领取哦~
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。