- 博客(46)
- 收藏
- 关注
原创 语句if
目前我们写的简单函数中可以有多条语句,但这些语句总是从前到后顺序执行的。除了顺序执行之外,有时候我们需要检查一个条件,然后根据检查的结果执行不同的后续代码,在c语言中可以用分支语句实现。例如:if(x != 0){ printf("x is nonzero.\n");}其中,“x != 0"表示x不等同于0的条件,这个表达式称为控制表达式,如果条件成立,则执行
2016-12-09 21:33:14 763
原创 常量指针和指针常量
指针常量与常量指针是c语言中两个比较容易混淆的概念。 (1)const char *p; (2)char * const p = a; (3)cahr * p = "abc";语句(1)定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但指针本身可以被修改,即“*p = 'b'”是非法的,*p 是p指向的常量的第一个字符,是个常量
2016-12-07 22:28:55 322
原创 针对文件流的几个常见函数
1.fopen:函数的功能:打开文件(基于标准I/O文件)函数的原型:FILE * fopen(const char *path,const char *mode)函数的参数:path:打开的文件路径或文件名mode:表示流行态,其中有以下几种情况:(1)r:打开只读文件,该文件必须存在(2)r+:打开读写文件,该文件必须存在(3)w:打开只写文件,
2016-12-05 21:43:42 679
原创 不带缓存的文件操作用到的几个的函数
不带缓存的文件I/O操作,主要用到6个函数--creat,open,read,write,lseek,close.这里的不带缓存是指每一个函数都只调用系统中的函数,这些函数虽然不是ANSI C的组成部分,但却是POSIX的组成部分。下面就来介绍一下这几个函数:1.creat:函数的作用:创建文件;函数原型:int creat(const char *pathname
2016-12-04 18:25:34 509
原创 数组和链表
1.数组:数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组。2.链表:链表中的元素在内存中不是顺
2016-12-03 20:52:10 309
原创 常见的内存错误和对策
编程时遇到内存错误是一件很麻烦的事。因为编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到,而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。常见的内存错误及其对策如下所示:(1)内存分配并未成功,但还是使用了它。初学者经常犯这个错误,因为并没有意识到内存分配也有可能不成功。 常用的解决办法是,在使用内存之前检查是否为NULL,如果指针p是
2016-12-02 18:18:16 420
原创 定义和声明
定义:什么是定义?所谓的定义就是(编译器)创造一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们常常说的定义名或对象名。但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊),它们就生死与共,终生不离不弃,并且这块内存的位置也不能被改变。一个变量或对象在一定区域内(如函数,全局)只能被定义一次,如果定义多次,编译器会提示你重复
2016-12-01 20:38:46 277
原创 typedef和#define的问题
在使用typedef和#define时,我们会发发现他们存在一些相似。有些时候我们会想到底用什么比较好呢?通常讲,typedef比#define好,特别是在有指针的场合。例如有两种定义p_str数据类型的方法如下:typedef char *p_str;#define p_str2 char*;p_str1 s1, s2;p_str2 s3,s4;在上述的
2016-11-30 21:45:22 198
原创 volatile关键字
volatile和static,const等常见的关键字一样也是一个类型修饰符,它主要用来修饰被不同线程访问和修改的变量。如果不加它,有时候就会发生无法编写多线程程序或者无法编写多线程程序。volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从变量的地址中读取,因而编译器生成的可执行码会重新从变量的地址读取数据进行操作。 volatile 影响编译器编译的结果,
2016-11-29 22:08:22 199
原创 malloc,calloc,ralloc
在内存中的4g划分中堆空间就是专门存放malloc,calloc,ralloc这几个分配空间的函数,下面就简单介绍一下他们的区别:1.malloc()(1)函数原型void *malloc(unsigned int num_bytes);(2)功能请求系统动态分配num_bytes个字节的空间,如果分配成功则返回第一个字节的地址,并且可以进行强制类型转换,告诉系统分
2016-11-28 21:28:27 304
原创 顺序栈和链栈
顺序栈:#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20 /* 存储空间初
2016-11-27 19:26:14 248
原创 链表的操作
今天学到了链表的知识,学会链表的一些简单的应用,实现链表的初始化,插入,删除和访问,还有判断是否为空和清除数据。。。。程序如下:#include "stdio.h" #include "string.h"#include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #in
2016-11-26 19:31:06 288
原创 一道智力游戏趣味编程题
题目如下:一副扑克有52张牌,打桥牌时应该把牌分配给四个人,请先设计程序模拟发牌的过程。要求:黑桃用S(SPACES)表示;红桃用H(HEART)表示;方块用D(diamond)表示;梅花用C(CLUBS)表示;问题分析:按照打桥牌的规则,每人应该发到13张牌,在人工发牌时,应该先进行“洗牌”,再把牌按一定的顺序发给每一个人。为了方便计算机进行模拟,可以将人工发牌的方式进行修改
2016-11-25 20:01:33 2133
原创 一道辗转相除的题
「辗转相除法」又叫做「欧几里得算法」,是公元前 300 年左右的希腊数学家欧几里得在他的著作《几何原本》提出的.利用这个方法,可以较快地求出两个自然数的最大公因数,即 HCF 或叫做 gcd.所谓最大公因数,是指几个数的共有的因数之中最大的一个,例如 8 和 12 的最大公因数是 4,记作 gcd(8,12)=4.#include int main() {
2016-11-24 20:36:44 301
原创 头文件
虽然我们经常会使用头文件,不过也只是用多了,其实很多时候都并不够了解。我们知道编译过程中的预处理阶段会进行头文件展开,宏替换以及条件编译。那么什么是头文件呢?百度百科是这样定义的:头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。 .c就是你写的程序文件。其实我一开始对头文件
2016-11-23 21:13:34 367
原创 怎么编写简单程序判断电脑是大端cpu还是小端cpu
电脑的cpu有两种,大端和小端cpu。大端cpu:所谓的大端,是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;小端:所谓的小端,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分
2016-11-22 19:51:30 3134
原创 几种常见的关键字
一.register:修饰寄存器变量;作用:请求编译器尽可能的将变量存在cpu内部寄存器中。优点:减少了cpu从内存中抓取数据的时间,可以提高程序的执行效率;适用对象:频繁访问的变量用register修饰,例如循环变量等;注意事项:1.register只能修饰局部变量,不能修饰函数和全局变量;2.不能用&来获取被register修饰的变量的地址,因为该变量可能不是在内存中存
2016-11-21 20:10:29 522
原创 结构体造成的内存空洞
实际编程时,经常需要处理批量数据,对于同类型的数据,我们可以使用数组来保存,但是如果是对不同类型数据进行批量处理,这就需要结构体了;结构体给我们变成带来了很多便利,但是它也有自身的缺陷:那就是容易造成内存空洞。首先我们来看一下下面的程序:#include struct node //noid为结构体名 { char ch1;
2016-11-20 20:57:35 1652
原创 c语言命名标准
为提高代码的可读性,好的命名是很重要的。1.而比较著名的命名规则首推匈牙利命名法,这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。 其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途
2016-11-19 20:43:55 497
原创 curses--图形函数库
前几天遇到一个问题要求从键盘输入密码,使用scanf函数,但是密码不显示出来,取而代之的是输出*;百度的时候终于知道这个问题的主要就是要关闭回显,一般我们从键盘用scanf输入数据时,终端会把这个数据显示在频幕上,很明显当我们要输入密码时,这种功能是有必要去除的,所以就要关闭回显,只要输出一个*就好了。而关闭回显就要使用curses这个图形函数库。(Linux和unix系统下)首先我们
2016-11-18 20:54:44 809
原创 指针数组和数组指针
很多时候我们看到数组指针和指针数组是不是不注意看就很容易把它们忽略掉呢,记得以前我还是傻傻分不清楚有什么区别;很显然指针数组和数组指针是不同的。指针数组:例如: char a[3][8]={"gain","much","strong"};char *n[3]={"gain","much","strong"};n[3]就是一个指针数组,很显然它本质上是一个数组,而数组中存放的
2016-11-17 20:43:46 177
原创 几个字符串相关的题目
今天整理了几个老师讲过的字符串的题目1.求一个字符串中数字出现的个数和最大数:例如输入ab12cd123ef1234;输出结果 max = 3,最大整数为1234;程序如下:#include #define MAX_SIZE 100int main(){ int max = 0; int i; int k = 0; int count =
2016-11-16 21:02:43 624
原创 数组的使用的几个注意
我们有时会遇到*a或者*(&a)之类的数组使用,a为数组名。那么今天就来简单介绍一下这些:比如说我们定义一维数组 int a[100];我们都知道一维指针名 a 保存的是数组首元素的地址,那么是否我们对数组进行遍历就可以像指针一样 a++ 来遍历呢?答案是不能,因为上面数组首字母的解释并不完整,完整的说法是一维数组名是一个指针常量,它保存数组首元素的地址。而我们知道,常量是保存在全
2016-11-15 22:34:57 725
原创 野指针的问题
在进行编程的时候我们有时会遇到一种错误警告:段错误那么什么是段错误呢?段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况其中一个比较典型的段错误原因就是由野指针导致的。那么什么又是野指针呢?野指针是指我们定义时未初始化的指针,因为它在定义时未初始化,
2016-11-14 19:38:08 279
原创 编程的趣味函数
今天我们来练习几个趣味的函数求解,函数虽然不难,不过要注意循环的使用和相应判断: 题目如下:1.百钱百鸡问题: 中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡”的问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何? 题目分析: 设鸡翁,鸡母,鸡雏的个数分别为x,y,z,提议给定共100钱买百鸡,若全买公鸡最多买
2016-11-13 22:25:57 750
原创 素数练习
今天又做了一些整数的练习,而且还是关于整数中素数的练习,习题如下:1.验证;2000以内的正偶数都能分解为两个素数之和(哥德巴赫猜想)问题分析:为了验证哥德巴赫猜想对2000以内的正整数都成立,要将整数分解为两部分,然后在判断分解出的两部分是否都为素数,若是则满足题意;否则,重新进行分解和判断;为了提高运算效率,对整数判断由”从2 到整数的一半“ 改为”从2 到整数的平方根
2016-11-12 20:18:38 298
原创 几种整数趣题
今天还是继续上次的整数相关趣味题进行练习;下面就是这几道题目,这些题目的解决方法很实用,不止这几题,对很对类似题目也适用。1.求个位数是6 且能被 3 整除的五位数:据题意可知,满足基本条件的五位数都是这种 10006, 10016,。。。。。99996 这种,可设基础数 I= 1000(i= 1000 ~ 9999),通过计算 i* 10 + 6就可以得
2016-11-11 19:33:43 362
原创 i++ 和 ++i 以及 i= i + 1 的运行效率
很多时候我们都只把注意力放在 i++和++I 上,它们的区别只是一个先加再用和先用再加而已,而这三者的运行效率很少有人考虑;今天老师问到才去探究;i = i + 1 ,i + = 1及 i++ 的效率哪个最高?为什么? 首先 i = i + 1最低,因为它的执行如下: (1) 读取右i的地址; (2) x+1; (3) 读取左i的地址; (4)
2016-11-10 20:12:34 1427
原创 输出几种常见的特殊整数
今天做练习遇到了几个题目都是求一些特殊整数的题目,所以选了几个比较常见的写下来:1.求完全数就是求一个数,它的因子之和等于它本身,比如 6 的因子是1 , 2, 3,而 1 + 2 + 3 = 6,所以6就是一个完全数。程序如下:(输入1--1000之内的完全数)#include int main(){ int a; int i; int m; printf
2016-11-09 21:13:07 555
原创 如何把一个整数转换成二进制
下面介绍一种把键盘输入的整数转换成二进制的方法:程序如下:#include void int2bin1(int num){ int i; for(i = 1; i < 33; i++) { if((unsigned int)(num & 0x80000000) == (unsigned int)(0x80000000)) {
2016-11-08 21:37:01 21720
原创 ++i 和 i++的区别(gcc编译器)
当我们谈到++i 和 i++时,也许会以为很简单:一句 i++是先使用,再++;++i 是先++,再使用。就可以概括。然而真的了解到了其中的区别吗?例如,有程序如下:#include int main(){ int i = 2; int c; c = (i++) + (++i) + (++i) + (i++); printf("c = %d,i
2016-11-07 16:54:07 624
原创 scanf 和printf 的相关注意事项
我们编程写代码的时候有时会遇到这样一个问题:编程如下:#include int main(){ int num; char ch; printf("please input the num(int):\n"); scanf("%d",&num); printf("num = %d\n",num); ********
2016-11-06 20:59:39 779
原创 内存虚拟地址空间的划分空间
当我们编码的时候我们的源程序一般都放在硬盘上,然后当我们使用这个程序时电脑就会在内存上运行这个程序,然而电脑内存资源是十分紧缺的,一般电脑内存都是4g,8g,2g。。所以当我们运行程序时并不是直接在内存上运行,而是在内存产生的虚拟地址空间上先进行,该虚拟空间一般也是4g,8g....。 这就涉及到了虚拟空间的内存划分了.以4g为例:首先在虚拟空间的高地址存放内核,内核是操作
2016-11-05 20:02:55 1027
原创 c语言和汇编语言的区别
什么是c语言: C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
2016-11-04 17:57:16 22766 1
原创 c语言的代码规范
当我们编写程序时,同一个程序代码不同的人编写出来给人的感觉就不一样;其中一个很大的区别就在于c语言的代码规范的把握。要打好一个规范美观的代码,主要是以下几个方面要注意:1.排版:程序快要采取缩进风格编写,缩进的空格数一般为4位;相对独立的语句块,变量说明后要加空行;程序块的分界符如(“{”和“}”)应各自独占一行,并处于同一列,同时引用它们的语句左对齐;不要把多个短
2016-11-03 19:50:31 657
原创 c语言结构体
以前学过的数据类型只能定义简单的数据信息,而像学生的基本信息(比如学号,姓名,出生日期,籍贯,成绩等多个数据构成)的复杂数据,就需要相关的结构体的知识。1.结构体类型变量的定义和引用。(1)结构体数据结构体定义形式:例如:struct student{ char name[9]; int age; float grade; .......
2016-11-02 18:47:11 275
原创 c语言中的文件
用计算机程序解决实际问题时,在待处理豁得出结果的数据量较大情况下,一般采用读写外部存储介质(如光盘,磁盘,u盘)中的数据。数据一般是以文件组织的形式存储。因此,读写数据就是读写外存中的文件数据。文件的定义:相关数据的集合。计算机中的程序数据,文档通常都组织成文件存放在外存储器中,由于输入输出设备具有字节流特征,所以操作系统也罢他们看作文件。缓冲文件系统;系统在主存中开辟的,用来临时
2016-11-01 20:00:28 258
原创 gcc,gdb基本用法
gcc创作背景:GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。[2] GCC是
2016-10-31 18:57:39 332
原创 怎样理解一个复杂的c语言声明
我们初学者总是分不清形如int * (* (*fp1) (int) ) [10];的变量声明,下面就来介绍这种变量声明的理解规律:想看懂这种变量声明,首先得学会右左法则; 就是先找到变量,再寻找变量右边的提示再看左边再右边一直循环;注: * 代表指针; 【】代表数组; ()代表函数;(不是所有的括号都代表函数,例如
2016-10-30 19:47:24 282
原创 gcc编译器初学
gcc的交叉编译: 可以在当前的体系平台上编译出可在另外的平台上运行的代码;编译器编译4个过程: 1.预处理: (1)头文件替换 头文件一般放
2016-10-29 19:28:19 406
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人