自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 C语言的数组相关的问题

C语言中只有一维数组,而且数组的大小必须在编译期就作为一 个常数确定下来。不过,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样,要“仿真"出一个多维数组就不是一件难事。对于一个数组,我们只能做两件事:确定该数组的大小以及获得指向该数组下标为0的指针元素。其他有关数组的操作,实际上都是通过指针进行的。1. 数组名在C语言中,在几乎所有使用数组名的表达式中,数组名的值是个指针常量,也就是数组第1个元素的地址。它的类型取决于数组元素的类型:如果它们是int类型,那么数组名的类型就.

2021-07-14 00:10:41 529

原创 为main函数提供返回值

最简单的C语言程序main(){ }函数main和其他函数一样,如果为显示地声明函数的返回类型,那么函数返回类型就默认为整型。但是这个程序并未给出任何返回值。大多数C语言实现都通过函数main的返回值来告知操作系统该函数的执行时成功还是失败。典型的处理方案是,返回值为0表示程序执行成功,返回值为非0表示程序执行失败。如果一个程序的main函数并不返回任何值,那么有可能看上去执行失败。如果正在使用一个软件管理系统,该系统关注程序被调用后执行是成功还是失败,那么很可能得到令人惊讶的结果。严

2021-07-14 00:10:07 205

原创 C语言的可移植性缺陷

1. 标识符名称的缺陷某些C语言实现把一个标识符中出现的所有字符都当作有效字符处理,而另一些C语言实现却会自动地截断一个长标识符名称的尾部。链接器也会对它能够处理的名称强加限制,例如外部名称中只允许使用大写字母。ANSI C标准所能保证的只是,C实现必须能够区别出前6个字符不同的外部名称。而且这个定义中并没有区分大小写。这个程序演示了一个能够确保检测到内存耗尽的简单办法。char *Malloc(unsigned n){ char *p,*malloc(unsigned); p

2021-07-14 00:09:25 1056

原创 使用errno检测错误

很多库函数,特别是那些与操作系统有关的库函数,当执行失败时会通过一个名称为errno 的外部变量,通知程序该函数调用失败。下面的代码利用这一特性进行错误处理,似乎再清楚明白不过,然而却是错误的:/*调用库函数*/if (errno) /*处理错误*/出错的原因在于,在库函数调用没有失败的情况下,并没有强制要求库函数一定要设errno为0,这样errno的值就可能是前个执行失败的库函数设置的值。下面的代码做了更正,似乎能够工作,但可惜还是错误的:errno = 0;/* 调用库函数*/if(

2021-07-14 00:08:29 333

原创 缓冲输入和内存分配

程序输出有两种方式:一种是即时处理方式: 另种是先暂存起来,然后再大块写入的方式。无缓冲输入:用户输入字符后,程序立刻将这个字符打印出来。缓冲输入:用户输入字符后,字符会存入一个缓冲区中,直到用户按下Enter键,才会打印缓冲区的字符,其优点是用户可以修改输入内容,增删减改。前者往往造成较高的系统负担。因此,C语言实现通常都允许程序员在进行实际的写操作之前控制产生的输出数据量。这种控制能力一般是通过库函数setbuf实现的。如果buf是一个 大小适当的字符数组,那么setbuf(stdout,b

2021-07-10 22:36:10 143

原创 C语言的递归调用

C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。标准并未说明递归需要堆栈。但是,堆栈非常适合于实现递归,所以许多编译器都是用堆栈来实现递归。1. 实例1:将二进制整数转换为字符/***接受一个整型值(无符号),把它转换为字符并打印它,前导零被删除。*/#include<stdio.h>void binary_to_ascii( unsigned int value ) { unsigned int quotient; quotien

2021-07-08 23:29:50 1026 2

原创 C语言的高级指针话题

1. 高级声明只有当确实需要的时候,才应该使用多层间接访问。不然的话,程序将会变得更庞大、更缓慢并且更难于维护。int f; /*一个整型变量*/int *f; /*一个指向整型的指针*/第二个声明把表达式*f声明为一个整数。我们就可以推断出f是个指向整形的指针。C声明的这个解释方法可以通过下面的方法验证int* f,g; 只有f才是一个指针,g只是一个普通类型的变量。int f();它把f声明为一个函数,它的返回值是一个整数。int *f();f是一个函数,它的返回值类型是

2021-07-08 23:28:53 144

原创 C语言的ADT和黑盒

C可以用于设计和实现抽象数据类型(ADT, Abstract Data Type),因为它可以限制函数和数据定义的作用域。这个技巧也被称为黑盒(black box)设计。抽象数据类型的基本想法是很简单的——模块具有功能说明和接口说明,前者说明模块所执行的任务,后者定义模块的使用。但是,模块的用户并不需要知道模块实现的任何细节,而且除了那些定义好的接口,用户不能以任何方式访问模块。限制对模块的访问是通过合理使用static关键字来实现的,它可以限制对那些并非接口的函数和数据的访问。例如,考虑一个用于维护一

2021-07-08 23:28:10 401 2

原创 检查外部类型

假顶有一个C程序,它由两个源文件组成//demo1.cextern int n;//demo2.clong n;这里假定两个语句都不在任何一个函数体内,因此n是外部变量。这是一个无效的C程序,因为同一个外部变量名在两个不同的文件中被声明为不同的类型。然而,大多数C语言的实现却不能检测出这种错误。当这个程序运行时,究竟会发生什么情况呢?存在很多的可能情况。C语言编译器足够“聪明”,能够检测到这一一类型的冲突。 编程人员将会得到一条诊断消息, 报告变量n在两个不同的文件中被给定了不同的类型

2021-07-08 23:27:31 98

原创 C语言的指针相关的问题

**声明一个指针变量并不会自动分配任何内存。在对指针执行间接访问前,指针必须进行初始化,要么使它指向现有的内存,要么给它分配动态内存。**对未初始化的指针变量执行间接访问操作是非法的,而且这种错误非常难以发现,其结果常常是一个不相关的值被修改。1. 未初始化和非法的指针int *a;*a = 12;这个声明创建了一个名叫a的指针变量,后面那条赋值语句把12存储在a所指向的内存位置。但是究竟a指向哪里呢?我们声明了这个变量,但从未对它进行初始化,所以没有办法预测12这个值将存储于什么地方。从这一点

2021-07-08 23:26:43 213

原创 C语言的预处理器

C预处理器(preprocessor)在源代码编译前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的文件的内容、定义和替换由#define 指令定义的符号,以及确定代码的部分内容是否应根据一些条件编译指令进行编译。大多数C语言实习在函数调用时都会带来重大的系统开销。我们希望有这样一中程序块,即它看上去像一个函数,但却没有函数调用带来的开销。举例来说:getchar和putchar经常被实现为宏,以避免在每次执行输入或输出一个字符这样简单的操作时,都要调用相应的函数从而

2021-07-08 23:26:09 430

原创 C语言的链接属性和存储类型

1. 链接属性当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数将链接在一起,形成可执行程序。然而,如果相同的标识符出现在几个不同的源文件中时,标识符的链接属性( linkage)决定如何处理在不同文件中出现的标识符。标识符的作用域与它的链接属性有关,但这两个属性并不相同。链接属性一共有3种一external (外部)、internal(内部)和none(无)。typrdef cahr *a;int b;int c ( int d ){ int

2021-07-08 23:25:18 279

原创 C语言的指针表达式

char ch = 'a';char *cp = &ch;让指针指向数组中的最后一个元素是合法的,但对它进行间接访问操作可能会失败。ANSI C标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但不允许与指向数组第一个元素之前的那个内存位置进行比较。1. *cp+1*操作符的优先级高于+,所以首先执行间接访问操作。我们可以得到它的值,我们取得这个值的一份副本并把它与1相加,表达式的最终结果为’b’。这个表达式的最终结果的存储位置并未清晰定义,所以它不

2021-07-07 22:18:28 440 1

原创 C语言的贪心法(大嘴法)

当C编译器读入了一个字符’/‘后又读入了一个字符’*’,那么编译器就必须做出判断:是将其作为两个分别的符号对待,还是合起来作为一个符号对待。C语言中,每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个符号,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略有时被称为“贪心法”,或

2021-07-07 22:17:30 319

原创 C语言的单引号和双引号的区别

用单引号引起来的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。因此,对于采用ASCII字符集的编译器而言,'a'的含义是0141(八进制)或者97(十进制)严格一致。用双引号引起来的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符'\0'初始化。 printf("Hello World\n"); /*两个语句等价*/ char hello[]={'H','e','l','l','o',' ','W','o','r

2021-07-07 22:16:47 7944

原创 C语言的const关键字

const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。 可以说,常变量是有名字的不变量,而常量是没有名字的。int *pi;*pi被声明一个整型,可以推断出pi是一个普通的指向整型的指针。int const *pci;*pci被声明为一个整型常量,可以推断出pci是一个指向整型常量的指针。你可以修改指针的值,但不能修改

2021-07-07 22:15:39 52

原创 C语言的短路求值

1. == 和 = 不一样在C语言中==表示比较操作,而=表示赋值操作。2. 逻辑操作符和位操作符的区别expression1 && expression2expression3 || expression4尽管&&操作符的优先级较低,但它仍然会对两个关系表达式施加控制。下面是它的工作原理: &&操作符的左操作数总是首先进行求值,如果它的值为真,然后就紧接着对右操作数进行求值。如果左操作数的值为假,那么右操作数便不再进行求值,因为整个表达式的值肯

2021-07-07 13:29:36 636

原创 C语言中的左移位和右移位

移位操作只是简单地把一个值的位向左或右进行移动。1. 左移位符号:<<在左移位中,之最左边的几位被丢弃,右边多出来的几个空位则由0进行补齐。例如:01101101 << 3结果:011010002. 右移位符号:>>逻辑移位:左边移入的位用0填充算术移位:左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0,这样能够保持原数的正负形式不变。例如:10010110 >> 2逻辑移位:00100101

2021-07-07 12:41:34 18141 1

原创 C语言的基本语句类型

1. 表达式语句C语言中没有"赋值语句"。赋值就是一种操作,就像加法和减法一样,所以赋值就在表达式内进行。2. if语句if( expression ) statement;else statement;只有当expression的值为真时,就执行第一个statements,否则就跳过它。若存在else子句,它后面的statements只有当expression的值为假时才执行。C并不具备布尔类型,而是用整型来代替。expression可以是任意能够产生整型结果的表达式——零值

2021-07-07 12:23:01 1562

原创 C语言数据类型

1. 整型家族C语言的整型家族包括字符、短整型、整型和长整型。它们都分为有符号(signed)和无符号(unsigned)。在C语言中长整型至少和整型一样长,而整型至少应该和短整型一样长。标准并未规定长整型必须比短整型长,只是规定它不得比短整型短。ANSI C标准加入了一个规范,说明了各种整型的最小允许范围。如下表:类型最小范围char0~127signed char-127~127unsigned char0~255short int-32767

2021-07-07 12:07:00 125

原创 C语言中的转义字符

转义字符有一个反斜杠\加上一个或多个其他符号组成\?在书写连续多个问号时防止被解释为三字母词\"用于表示一个字符串常量内部的双引号\'用于表示字符串常量'\\用于表示一个反斜杠,防止它被解释为转义序列有许多字符并不在源代码中出现,但它们在格式化程序输出或操作终端显示屏的时候非常有用。\a警告字符。它将奏响终端铃声或产生其他一些可听见可看见的信号\b退格符\f进纸字符\n换行符\r回车符\t水平制表符\v垂直制表符\dddddd表示1~3个八进制数字。这个转义符表示的字符就是给定的八

2021-07-07 10:48:46 1696

原创 C语言中的翻译和执行

C语言的环境在ANSI C的任何一种实现中,存在两种不同的环境。第1种是翻译环境(translation environment),在这个环境里,源代码被转换为可执行的机器指令。第2种是执行环境(execution environment),它用于实际执行代码。标准明确说明,这两种环境不必位于同一台机器上。例如,交叉编译器(cross-compiler)就是在一台机器上运行,但它所产生的可执行代码运行于不同类型的机器上。操作系统也是如此。标准同时讨论了独立环境(freestanding enviro

2021-07-07 10:23:11 682

原创 和while((ch = getchar()) != EOF)有关的问题

EOF在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。int ch;...while( (ch = gerchar()) != EOF)......

2021-06-29 13:21:18 1405

原创 Hello World!

Hello World!记录一下人生知识输出

2021-06-28 21:36:16 49 10

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除