C指针原理教程之C快速入门
一、C简介
1、C语言简介
C语言是一门语法 精简的语言,它的关键字仅有32个,C语言以main函数为主函数,程序编译运行后后,执行的就是main函数的内容,因此,纵观很多C语言程序,形成了一道有趣的风景线:头文件和许多c代码文件以main函数为中心和起始点构造,在main函数中调用了这些文件中编写的代码,引用头文件。C语言程序实质就是在程序中调用 C标准库提供的函数、其它C库提供的函数、操作系统提供的API接口、自己定义的函数,同时应用适当的数据结构和算法来完成工作。
C语言虽然精简,但却很强大,它不但能完成比它更复杂的程序语言所做的事情,而且还能做其他语言不擅长的工作,比如操作系统,LINUX、UNIX的内核、gnome桌面等等都是C语言的杰作,尤其在系统内核的设计与研发领域,它的“兄弟”C++也不是对手(至今为止,没有出现一款用C++制作的桌面系统或嵌入式系统的内核)。
2、C语言的关键字
auto :声明自动变量
short :声明短整型变量或函数
int: 声明整型变量或函数
long :声明长整型变量或函数
float:声明浮点型变量或函数
double :声明双精度变量或函数
char :声明字符型变量或函数
struct:声明结构体变量或函数
union:声明共用数据类型
enum :声明枚举类型
typedef:用以给数据类型取别名
const :声明只读变量
unsigned:声明无符号类型变量或函数
signed:声明有符号类型变量或函数
extern:声明变量是在其他文件正声明
register:声明寄存器变量
static :声明静态变量
volatile:说明变量在程序执行中可被隐含地改变
void :声明函数无返回值或无参数,声明无类型指针
if:条件语句
else :条件语句否定分支(与 if 连用)
switch :用于开关语句 case:开关语句分支
for:一种循环语句
do :循环语句的循环体
while :循环语句的循环条件
goto:无条件跳转语句
continue:结束当前循环,开始下一轮循环
break:跳出当前循环
default:开关语句中的“其他”分支
sizeof:计算数据类型长度
return :子程序返回语句(可以带参数,也可不带参数)循环条件
猜数字:
我们来一步步打造一个猜数字的游戏
游戏的大意是:输入一个1-500以内的正整数,程序根据玩家输入的数字,提示数字比正确答案之前大,或者数字比正确答案之间小,比如要猜的数字是85,玩家第一次输入90,提示比要猜的数字大,第二次输入80,提示比要猜的数字小,第二次输入85,提示猜中了。
下面来一步步打造这个游戏,帮助大家快速复习C语言基础知识。
(1)编写输入数字的代码,并编译执行。
dp@dp:~/cquick % cat guessnum.c
#include <stdio.h> int main(){ int mynum; printf("你好,请输入一个数字:"); scanf("%d",&mynum); printf("\n你输入的数字是:%d\n",mynum); }
接着在终端编译执行:
dp@dp:~/cquick % gcc guessnum.c -o myguess dp@dp:~/cquick % ./myguess 你好,请输入一个数字:55 你输入的数字是:55 dp@dp:~/cquick %
纵观上面程序及其执行结果,可发现,C语言中可使用printf函数完成屏幕输出,可使用scanf函数接受指定格式的数据录入,此外,”\n”表示换行符,”%d”表示整数格式。
(2)限制输入数字的范围
游戏的要求是1-500以内的整数
但是如果我们在上述程序中输入900、-10等不符合要求的数字,仍然能通过,
你好,请输入一个数字:900
你输入的数字是:900
你好,请输入一个数字:-10
你输入的数字是:-10
系统没有提示错误。因此,需要修改程序限制玩家输入数字的范围
#include <stdio.h> int main(){ int mynum; printf("你好,请输入一个数字:"); scanf("%d",&mynum); if (mynum>500 ||mynum<1){ printf("数字仅限于1-500之间,请重新运行本程序!\n"); } else{ printf("\n你输入的数字是:%d\n",mynum); } }
运行程序:
dp@dp:~/cquick % gcc guessnum.c -o myguess dp@dp:~/cquick % ./myguess 你好,请输入一个数字:200 你输入的数字是:200 dp@dp:~/cquick % ./myguess 你好,请输入一个数字:900 数字仅限于1-500之间,请重新运行本程序! dp@dp:~/cquick %
上面程序使用了C语言的if...else...语句块,这是一个很多语言都有的机制(包括一些函数语言,比如haskell的if...then...else....),该语句块分2个部分,第1个部分if语句段,表示如果if后面跟的条件满足的话,执行if语句段,第2个部分是else语句段,如果if后的条件不满足执行,什么是条件满足与不满足,C语言可理解为如果条件的返回值非0表示条件满足,如果是0则表示条件不满足。
可以将多个条件组合成一个综合条件做为该语句块的条件,方式是使用||(表示或者)或&&(表示并且),比如上面程序中的条件:mynum>500 ||mynum<1
但是C语言中有一个关键字NULL,在C语言中,条件语句中出现的NULL和0的值是一样的,但NULL常用于指针和对象,0常用于int等整型数。这意味着,如果出现了下面类似的语句块,就意味着是对含有指针变量(指针变量通常用于指向其它变量的内存地址,比如下面代码中的mypoint1和mypoint2)的条件进行判断了:
if (mypoint1!=NULL){ ............ } if (mypoint2==NULL){ ............ }
从运行效果来看,错误的数字没有被接受,但要想重新输入,必须重新运行一次程序。
(3)引入循环机制
C语言中可以使用while循环,语法格式如下:
while(条件){
语句块
}
或者使用do...while循环,语法格式如下:
do{
语句块
}while (条件)
通过循环,在玩家输入错误数字的情况下,给玩家重新输入的机会,而不是直接退出程序。
dp@dp:~/cquick % cat guessnum.c
#include <stdio.h> int main(){ int mynum; int ispass=0; while (!ispass){ printf("你好,请输入一个数字:"); scanf("%d",&mynum); if (mynum>500 ||mynum<1){ ispass=0; printf("数字仅限于1-500之间,请重新运行本程序!\n"); } else{ ispass=1; printf("\n你输入的数字是:%d\n",mynum); } } }
编译并运行:
dp@dp:~/cquick % gcc guessnum.c -o myguess dp@dp:~/cquick % ./myguess 你好,请输入一个数字:1234 数字仅限于1-500之间,请重新运行本程序! 你好,请输入一个数字:-12 数字仅限于1-500之间,请重新运行本程序! 你好,请输入一个数字:88 你输入的数字是:88
上述程序中的while的条件中使用了“!”,它表示逻辑非。
也可以用do...while来实现它:
#include <stdio.h> int main(){ int mynum; int ispass=0; do{ printf("你好,请输入一个数字:"); scanf("%d",&mynum); if (mynum>500 ||mynum<1){ ispass=0; printf("数字仅限于1-500之间,请重新运行本程序!\n"); } else{ ispass=1; printf("\n你输入的数字是:%d\n",mynum); } } while (!ispass); }
dp@dp:~/cquick % gcc guessnum.c -o myguess dp@dp:~/cquick % ./myguess 你好,请输入一个数字:8889 数字仅限于1-500之间,请重新运行本程序! 你好,请输入一个数字:12 你输入的数字是:12
观察上面2个程序可看出,使用了ispass这个变量做为是否退出循环的依据,也可以不使用ispass,直接通过break语句退出循环(注意,只能退出break语句本身所在的那层循环),
#include <stdio.h> int main(){ int mynum; int ispass=0; while(1){ printf("你好,请输入一个数字:"); scanf("%d",&mynum); if (mynum>500 ||mynum<1){ printf("数字仅限于1-500之间,请重新运行本程序!\n"); } else{ printf("\n你输入的数字是:%d\n",mynum); break; } } }
dp@dp:~/cquick % gcc guessnum.c -o myguess dp@dp:~/cquick % ./myguess 你好,请输入一个数字:8788 数字仅限于1-500之间,请重新运行本程序! 你好,请输入一个数字:66 你输入的数字是:66 dp@dp:~/cquick %
您可能感兴趣的文章
- 01-10深入理解数组指针与指针数组的区别
- 01-10基于C++输出指针自增(++)运算的示例分析
- 01-10解析sizeof, strlen, 指针以及数组作为函数参数的应用
- 01-10探讨C++中数组名与指针的用法比较分析
- 01-10深入理解双指针的两种用法
- 01-10libxml教程(图文详解)
- 01-10C语言数组指针的小例子
- 01-10基于SVN源码服务器搭建(详细教程分析)
- 01-10解析如何用指针实现整型数据的加法
- 01-10深入const int *p与int * const p的区别详解(常量指针与指向常量的指
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11ajax实现页面的局部加载
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文