电脑桌面
添加盘古文库-分享文档发现价值到电脑桌面
安装后可以在桌面快捷访问

c语言之define用法

来源:莲生三十二作者:开心麻花2025-11-191

c语言之define用法(精选7篇)

c语言之define用法 第1篇

C语言之define用法总结

#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率。1 #define命令剖析 1.1

#define的概念

#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。紧跟在define后面的标识符称为宏名。对于宏名,存在一个独立的名字空间。

该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。

(1)

简单的宏定义:

#define

<宏名>

<字符串>

例:

#define PI 3.1415926(2)带参数的宏定义

#define

<宏名>(<参数表>)

<宏体>

例: #define

A(x)x 一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。

1.2 宏替换发生的时机

为了能够真正理解#define的作用,让我们来了解一下对C语言源程序的处理过程。当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程,见图1。

源程序→→→→预处理器→→→→修改后的源程序→→→→编译器→→→→汇编程序→→→→汇编器→→→→可重定位的目标程序→→→→→→→→连接器→→→→可执行的目标程序

其中预处理器产生编译器的输出,它实现以下的功能:(1)文件包含

可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。

(2)条件编译

预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。(3)宏展开

预处理器将源程序文件中出现的对宏的引用展开成相应的宏定义,即本文所说的#define的功能,由预处理器来完成。

经过预处理器处理的源程序与之前的源程序有所有不同,在这个阶段所进行的工作只是纯粹的替换与展开,没有任何计算功能,所以在学习#define命令时只要能真正理解这一点,这样才不会对此命令引起误解并误用。2 #define使用中的常见问题解析 2.1 简单宏定义使用中出现的问题

在简单宏定义的使用中,当替换文本所表示的字符串为一个表达式时,容易引起误解和误用。如下例: 例1

#define

N

2+2

(位置在主函数前)

void main()

{

int

a=N*N;

printf(“%d”,a);

}(1)出现问题:在此程序中存在着宏定义命令,宏N代表的字符串是2+2,在程序中有对宏N的使用,一般同学在读该程序时,容易产生的问题是先求解N为2+2=4,然后在程序中计算a时使用乘法,即N*N=4*4=16,其实该题的结果为8,为什么结果有这么大的偏差?(2)问题解析:如1节所述,宏展开是在预处理阶段完成的,这个阶段把替换文本只是看作一个字符串,并不会有任何的计算发生,在展开时是在宏N出现的地方只是简单地使用串2+2来代替N,并不会增添任何的符号,所以对该程序展开后的结果是a=2+2*2+2,计算后=8,这就是宏替换的实质,如何写程序才能完成结果为16的运算呢?(3)解决办法:将宏定义写成如下形式

#define

N

(2+2)

这样就可替换成(2+2)*(2+2)=16 2.2 带参数的宏定义出现的问题

在带参数的宏定义的使用中,极易引起误解。例如我们需要做个宏替换能求任何数的平方,这就需要使用参数,以便在程序中用实际参数来替换宏定义中的参数。一般学生容易写成如下形式:

#define

area(x)

x*x 这在使用中是很容易出现问题的,看如下的程序

void main()

{

int

y=area(2+2);

printf(“%d”,y);

} 按理说给的参数是2+2,所得的结果应该为4*4=16,但是错了,因为该程序的实际结果为8,仍然是没能遵循纯粹的简单替换的规则,又是先计算再替换了,在这道程序里,2+2即为area宏中的参数,应该由它来替换宏定义中的x,即替换成2+2*2+2=8了。那如果遵循(1)中的解决办法,把2+2 括起来,即把宏体中的x括起来,是否可以呢?#define

area(x)(x)*(x),对于area(2+2),替换为(2+2)*(2+2)=16,可以解决,但是对于area(2+2)/area(2+2)又会怎么样呢,有的学生一看到这道题马上给出结果,因为分子分母一样,又错了,还是忘了遵循先替换再计算的规则了,这道题替换后会变为(2+2)*(2+2)/(2+2)*(2+2)即4*4/4*4按照乘除运算规则,结果为16/4*4=4*4=16,那应该怎么呢?解决方法是在整个宏体上再加一个括号,即#define

area(x)((x)*(x)),不要觉得这没必要,没有它,是不行的。

要想能够真正使用好宏定义,那么在读别人的程序时,一定要记住先将程序中对宏的使用全部替换成它所代表的字符串,不要自作主张地添加任何其他符号,完全展开后再进行相应的计算,就不会写错运行结果。如果是自己编程使用宏替换,则在使用简单宏定义时,当字符串中不只一个符号时,加上括号表现出优先级,如果是带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个括号。看到这里,不禁要问,用宏定义这么麻烦,这么容易出错,可不可以摒弃它,那让我们来看一下在C语言中用宏定义的好处吧。3

宏定义的优点(1)

方便程序的修改 使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时,我们可以用较短的有意义的标识符来写程序,这样更方便一些。我们所说的常量改变不是在程序运行期间改变,而是在编程期间的修改,举一个大家比较熟悉的例子,圆周率π是在数学上常用的一个值,有时我们会用3.14来表示,有时也会用3.1415926等,这要看计算所需要的精度,如果我们编制的一个程序中要多次使用它,那么需要确定一个数值,在本次运行中不改变,但也许后来发现程序所表现的精度有变化,需要改变它的值,这就需要修改程序中所有的相关数值,这会给我们带来一定的不便,但如果使用宏定义,使用一个标识符来代替,则在修改时只修改宏定义即可,还可以减少输入 3.1415926这样长的数值多次的情况,我们可以如此定义 #define

pi

3.1415926,既减少了输入又便于修改,何乐而不为呢?(2)提高程序的运行效率

使用带参数的宏定义可完成函数调用的功能,又能减少系统开销,提高运行效率。正如C语言中所讲,函数的使用可以使程序更加模块化,便于组织,而且可重复利用,但在发生函数调用时,需要保留调用函数的现场,以便子函数执行结束后能返回继续执行,同样在子函数执行完后要恢复调用函数的现场,这都需要一定的时间,如果子函数执行的操作比较多,这种转换时间开销可以忽略,但如果子函数完成的功能比较少,甚至于只完成一点操作,如一个乘法语句的操作,则这部分转换开销就相对较大了,但使用带参数的宏定义就不会出现这个问题,因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。宏定义可完成简单的操作,但复杂的操作还是要由函数调用来完成,而且宏定义所占用的目标代码空间相对较大。所以在使用时要依据具体情况来决定是否使用宏定义。4 结语

c语言之define用法 第2篇

C程序一直由下列部分组成:

正文段CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;

初始化数据段(数据段)在程序中所有赋了初值的全局变量,存放在这里,

非初始化数据段(bss段)在程序中没有初始化的全局变量;内核将此段初始化为0。

栈增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。

堆动态存储分。

|-----------|

|          |

|-----------|

|    栈   |

|-----------|

|    |     |

|   |/   |

|          |

|          |

|   /|   |

|    |     |

|-----------|

|    堆   |

|-----------|

| 未初始化|

|-----------|

| 初始化 |

|-----------|

| 正文段 |

|-----------|

二、 面向过程程序设计中的static

1. 全局静态变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

看下面关于作用域的程序:

查看原始代码

//teststatic1.c

voiddisplay;

externintn;

intmain()

{

n=20;

printf(“%dn”,n);

display();

return0;

}

查看原始代码

//teststatic2.c

staticintn;//定义全局静态变量,自动初始化为0,仅在本文件中可见

voiddisplay()

{

n++;

printf(“%dn”,n);

}

文件分别编译通过,但link的时候teststatic1.c中的变量n找不到定义,产生错误。

定义全局静态变量的好处:

<1>不会被其他文件所访问,修改

<2>其他文件中可以使用相同名字的变量,不会发生冲突。

2. 局部静态变量

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

内存中的位置:静态存储区

初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束,

注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数

在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

例如:

查看原始代码

//teststatic1.c

voiddisplay();

staticvoidstaticdis();

intmain()

{

display();

staticdis();

renturn0;

}

查看原始代码

//teststatic2.c

voiddisplay()

{

staticdis();

printf(“display() has been calledn”);

}

staticvoidstaticdis()

{

printf(“staticDis() has been calledn”);

}

文件分别编译通过,但是连接的时候找不到函数staticdis()的定义,产生错误。

定义静态函数的好处:

<1> 其他文件中可以定义相同名字的函数,不会发生冲突

<2> 静态函数不能被其他文件所用。

存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。

auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。

关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。

由于static变量的以上特性,可实现一些特定功能。

1. 统计次数功能

声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。代码如下:

查看原始代码

voidcount();

intmain()

{

inti;

for(i=1; i<=3; i++)

count();

return0;

}

voidcount()

{

staticnum=0;

num++;

printf(“ I have been called %d”,num,“timesn”);

}

输出结果为:

I have been called 1 times.

C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。

由于C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来访问它(定义外部变量或函数的源文件中也可以包含对该外部变量的extern声明)。

C语言中指针的用法 第3篇

在C语言中, 指针是一种很重要的数据类型。程序运行时, 所有的数据都存放在计算机的内存单元中, 为了能够正确的访问这些内存单元, 在计算机内部, 所有的内存单元都要统一的进行“编号”, 也就是说, 所有的内存单元都要有地址, 并且具有唯一的内存地址。一个变量在内存中对应一个单元地址, 通常把这个地址称为指针。

在C语言中, 指针定义的一般形式为:类型说明符*指针名。

与其他程序设计语言有所不同, C语言允许使用变量的地址来访问变量, 这就意味着C语言中除了有存储数、字符等内容的普通变量外, 还有一种特殊的变量。这种变量存储的是另一个变量的地址, 而不是通常意义下的数和字符, 这种存储地址的变量称为指针变量。例如, 当变量a存储了变量b的地址, 就称变量a指向了变量b。

二、指针的引用

1. 指针的初始化。

数据类型*指针名=初始地址值。例如:int i, *p=&i。在这需要注意几个问题, 首先指针变量在使用前需要先赋值, 其次指针所指的变量已经说明过, 而且指针与所指变量类型应该一致, 最后还需注意不能对指针赋非地址值。

2. 指针变量的引用。

例子如下。

本程序首先定义指针变量p和q, 并在定义的时候对变量p初始化, 使它指向变量m。赋值语句n=*p*2-3表示将p所指向的存储单元中的值28乘以2再减去3, 再将这一表达式的值赋给变量n。q=&c1表示指针变量q指向字符变量c1的存储单元。赋值语句*q=c2+1表示将字符’g’送入q指向的存储单元中。最后程序运行的结果为:

在这里需要注意, 当*p出现在变量定义中的时候, 表示定义了指针变量p;如果出现在表达式中则表示取p所指对象的内容。

三、指针与数组

在C语言中, 指针与数组有着十分密切的联系。可以说程序中凡是用数组处理的算法都可以通过指针实现, 而且速度要比下标法快得多。

1. 指针与一维数组。

假设有定义语句:int a[100], *p=a;将数组a的首地址赋予了指针变量p, 这就使指针变量p指向了数组a的第一个分量a[0]。由于数组的存储结构是连续的, 即数组元素在内存中是连续存放的, 因此a+i就是a[i]的存储地址&a[i], * (a+i) 表示取a+i地址中的内容。当指针变量p指向数组的首元素a[0]时, p+i就代表a[i]的地址, * (p+i) 就代表a[i]。当指针p指向一维数组中的某个分量时, 执行p++或p--就表示使指针p后移或前移一个存储单元, 其位移的字节数取决于基类型。

2. 指针与二维数组。

当指向数组的指针处理二维数组时, 有以下使用规则:

p是行指针, p+i、p++或p--均表示指针移动的单位是行;p只能指向二维数组中的行, 而不能指向一行中的某个元素, 但是可以通过p引用二维数组中的元素, 例如引用a[i][j]可以用表达式* (* (p+i) +j) 或* (p[i]+j) 来表示。引用a[i][j]的地址可以用* (p+i) +j或p[i]+j表示;指针名p与二维数组名a虽然都代表“行指针”, 但指针名p为变量, 所以它可以被赋值, 而二维数组名a不能被赋值。

四、指针与函数

在C语言中, 指针与函数之间存在着广泛的联系, 其中最基本的联系就是指针变量作为函数的参数。将函数的参数设置为指针变量可以实现通过参数将函数值带出函数体的目的。

除此之外, 我们还能够在程序中使用函数指针。指向函数的指针, 称为“函数指针”。借助于该指针能够使函数如同普通变量一样的被传递和调用, 用函数指针作为函数的参数能够提高函数的通用性。

五、结束语

c语言之define用法 第4篇

【关键词】C语言 对策 上机实践

【中图分类号】TP312.1-4 【文献标识码】A 【文章编号】2095-3089(2016)11-0035-01

“C 语言”因为工具性与技能性在计算机教育中占据重要的地位而被列为计算机专业的必修课。由于技校学生大部分是由初中毕业升学而来,自身基础薄弱加之 C 语言自身的特点,大部分学生反映在上课像在听“天书”,完全听不懂,作业做不出,更不要谈灵活应用解决相关的实际问题。

一、导致学生在听“天书”的原因

1.学生自身基础差

学习C语言需要学生要一定的计算机基础、数学基础、英语基础和逻辑思维能力。其中受环境和条件的限制导致部分学生计算机基础较差,生源问题导致部分学生数学基础、英语基础较差,而逻辑思维能力大大影响学生分析、设计、调试程序的能力。所以以上四个制约因素是在学习C语言中由于自身基础差而导致听不懂的重要原因之一。

2.C语言自身的特点

C 语言是计算机语言,是人与计算机交流的语言之一。对于从来没有接触机器语言的学生来说,如何实现自然语言到程序自动化语言的转化,如何将自然语言描述的问题用 C 语言描述并让计算机解决是学生在学习中的最大障碍。

另外C 语言的一些特点,比如运算符丰富、语法限制不严格、用户能够自定义数据类型、程序设计自由度大等等既是 C语言的优点,也是初学者学习的难点。例如:算术运算符中除法运算符/和求余运算符(模算符)%,如5/3的值为1,舍去小数部分,但是如果除数或被除数中有一个为负值,则舍入的方向是不固定的,-5/3在有的机器上的结果是-1,有的机器上是-2。而0%5的结果是5,2%5的结果却是0。大部分学生找不到正确的学习方法,先是硬着头皮学,结果越学越乱,越乱越听不懂。

二、针对存在这一问题的对策

要解决C语言的“听天书”问题,必须分别从师生两方面下手。

1.教师改进教学方法,提高教学质量

1.1改变传统的教学方法

C语言的教学内容较多,教师在教学中为了完成教学任务,在有限的课堂时间里讲的知识点太多,学生没有足够的时间去消化,一堂课下来学生“走马观花”,什么都没听懂。那么就要改变传统的教学方法,灵活地安排教学内容和上机时间,在讲授基本结构、变量、运算符与表达式等比较简单的章节时,可以边讲课让学生边操作,而对于比较难的章节,如数组、结构体、指针等内容,教师要以学生学习进度出发安排课程,并要注重学生在学习后的反馈。若只采用一种教学方法从一而终是不可取的,因此,需要教师在教学过程中不断探讨、总结经验,合理运用各种教学方法。如通过案例教学法、问题引入法、任务驱动法等方法来吸引学生学习的兴趣。在案例选择时应该与实际相结合,具有趣味性。

1.2结合实践,培养逻辑及创造性思维能力

语言学习必须理论与实践相结合,这就要求教师要精讲多练。教师要讲到要点上,充分体现典型例题的编程思路、算法,将严谨、富有逻辑性的编程规范思想清晰地展现在学生面前。多练是学习编程的关键,只有在上机实践中学生才能真正学会如何编写和调试程序,才能更好地掌握理论知识及其应用。在C语言实验教学中安排合理实验时间,注重理论联系实际,不仅要注意例题的针对性、典型性和灵活性,还应该提倡一题多解,培养学生从多种角度对问题进行思考的能力,拓宽解题思路,训练学生发散性思维。上机实践中也应该与实际相结合,否则多数学生在上机时只是验证程序,没有思考,感觉上机很无聊。教师可以采用分组参加项目设计来提高学生的兴趣,每一组中必须有动手能力强和动手能力弱的同学同组,通过编写简单一些游戏项目如:扫雷、贪吃蛇、五子棋等让学生体会实际编程中学与用结合的乐趣,从而提高学生实际编程能力。

2.学生树立正确的学习观念,学会学习,自主学习

2.1正确认识 C语言,树立信心

认识C 语言的重要性,树立“既学之,则学好”的信心。C语言是技校计算机专业的学生学习其他计算机课程的先行课,是一门最基础的计算机编程语言,应用广泛,不仅在软件开发上,而且它几乎是一切计算机技术的通用工具。C语言学习的好坏,直接关系到计算机编程思维能力能否建立。不论哪种计算机语言,计算机编程思维是相通的,只要学好 C 语言,就可以很好地学习任何一种编程工具。想要学好语言就得树立信心,克服困难,循序渐进,脚踏实地学习。

2.2夯实基础,多读、多写,“熟读百遍”

古话说“熟读唐诗三百首,不会作诗也会吟”,C 语言虽然是机器语言,但它和自然语言的学习方法是一样的。对C语言的学习也是要求熟读课本,多读、多写,才能打好基础。只有这些基础知识掌握够牢固,才能为自己编程打下良好的基础。

2.3注重实践,多学、多练、“其义自现”

C语言的实践性很强。只有在上机实践中学生才能真正学会如何编写和调试程序,才能更好地掌握理论知识及其应用。在实践学习中,理论联系实际,把编程思路和程序测试放在首位,才能提高分析和解决问题。C 程序设计语言的学习可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。如:C 语言的语法规则,学习起来枯燥无味,死记硬背费精力费时间,还可能不会灵活运用。就可以通过上机实践,在调试程序过程中,加深对它的理解,在理解的基础上自然而然地掌握 C 语言的语法规定。程序最终也是在计算机上实现的,程序正确与否、存在什么问题上机调试并运行正确后就可以知道,编程能力的提高也正是在不断发现错误、改正错误中提高的。

三、总结

教和学是教学过程中的两个重要方面,一门课程大部分学生反映听不懂,那么问题一定出在这两方面。在 C 语言教学中,有教师在教学中的教学方法和教学模式的落后,导致学生学习效果差,也有学生自身的主观和客观方面的原因。针对这些问题,对症下药,教师通过教学手段引导学生学习,给予他们正确的学习方法;学生树立正确的学习观念,自主的用 C 语言来分析问题和解决问题,寓教于学,才能解决问题。

参考文献:

[1]谭浩强.C 程序设计[M].北京:清华大学出版社,2005

[2]王兰.学好《C 程序设计》的几点建议[J].科技信息 ,2007,(9)

C语言中指针用法解析 第5篇

指针是c语言的特色之一, 也是学生学习c语言程序设计时的一个难点, 灵活掌握指针的用法, 正确而灵活地运用它可以有效地表示复杂的数据结构, 可以动态地分配内存, 可以直接处理内存地址等。可以使复杂的程序变得简洁紧凑。

但是在实际教学中发现大部分学生对指针的理解和应用感到困惑, 特别是什么时候用什么类型的指针变量。他们在编程过程中是能不用就不用, 针对这种情况, 本文对指针应用中的一些问题进行了梳理, 以便于学生掌握指针的应用。

二、基本概念辨析

如果在使用中定义了一个变量, 在编译时系统就会给这个变量分配内存单元。

例如:int x=5, y=9; (如图所示)

变量名是指数据对象的名称, 例如x, y等为整形变量名, 变量值是指数据对象的值, 例如3, 4即为x, y的值, 指针即数据对象的内存地址, 例如地址为1000的单元中存放的是变量x的值。

指针变量是一种专门存放数据对象的内存地址的变量。如何帮助学生去理解二者呢, 我们就可以形象化地打个比方, 假设卫生信息管理2班在门牌号为508的教室, 如果把508教室这个门牌号比做内存地址, 那么信管2班的学生就是508教室这个内存地址所存储的值。

2.1指针变量的定义

一般格式为:类型说明符*指针变量名1, *指针变量名2, ;例如int*p, *q;

对指针变量的类型说明包括三个内容

1、类型说明符:即指针变量的值所指向的数据类型值, 前例中的int即为指针变量所指向的数据类型;

2、指针类型说明:即定义变量为一个指针变量, 其标志是变量名前的*;

3、指针变量名:前例中的p, q即为指针变量名。

2.2指针变量赋初值

由于指针就是地址, 因此指针变量中存放的是地址, 所以赋值即是将某个地址赋给指针变量, 如下所示 (p、q为指向整形数据的指针变量, i、j为整形变量, a是存放整形数据的数组)

int*p, *q;int i=3, j=4;int a[5]={0, 1, 2, 3, 4};

p=&i;q=&j; (将变量i, j的地址赋给p, q)

p=a; (将数组a的首地址赋给p, 相当于p=&a[0])

p=&a[i]; (将数组a中第i个元素的地址赋给p)

q=p; (将指针变量p的地址赋给指针变量q)

三、指针的应用

3.1数组中指针的应用

在C语言中, 数组与指针是两个非常重要的数据类型, 它们之间有着十分密切的关系, 它们都适于处理内存中连续存放的一系列数据, 数组元素的引用可用指针的描述来实现。

从上面的程序中, 可以看出* (p+i) 等价于a[i]。

例:有char a[4]=”xy”;char*p;执行了语句p=a;之后, * (p+2) 的值应该为’�’。

数组中的行指针和列指针, 例:

一维数组名表示一维数组首地址, 是列指针常量;二维数组名表示二维数组首地址, 是行指针常量。归纳可得:一维数组名+i=列指针;二维数组名+i=行指针。行指针与列指针是不同类型的指针, 但它们存放的地址可能相同, 而所表示的含义却不同。

例中a和a[0]指向同一个位置, 即a等于a[0], 但a+1不等于a[0]+1。因为a+1中的1表示数组中的一行, 而a[0]+1中的1表示数组中的一个元素。假设a和a[0]的地址为2000, 可推算出a+1的地址为2008, 而a[0]+1的地址则为2002。

行指针和列指针可以相互转换。将行指针降级即转变为列指针, 降级的方法有指针法和下标法, 即利用指针运算符*或下标运算符[]都可以使一个指针降级。例如a为行指针, a*和a[0]则表示列指针;反之, 将列指针升级, 即前面加地扯运算符&就转换为行指针, 例如*a和a[0]表示列指针, &*a和&a[0]则表示行指针。

3.2函数参数中指针的应用

在C语言中, 函数的形参是局部变量, 实参和形参变量间的传递是值传递, 即将实参的值传递给形参变量, 形参在函数中如何变化, 并不改变实参的值, 我们称之为单向传递。这种参数的单向传递减少了函数之间的耦合性, 增加了其内聚性, 有利于结构化编程。但是如果调用函数想从被调函数中得到一个以上的返回值, 就比较困难。虽然通过全局变量也能实现, 但过多的全局变量不利于结构化编程。如果实参和形参都使用指针变量, 就可达到此目的。需要说明的是, 实参和形参之间传递的仍然是值, 但该值不是变量的值, 而是变量的地址。

3.3链表中指针的应用

链表是一种常见的重要的数据结构, 它是动态地进行存储分配的一种结构, 在C语言中使用数组必须事先定义固定的长度, 是一种静态存储分配, 不适合用来实现链表, 而指针可以实现动态存储分配, 用来实现对链表的创建、插入和删除等操作。以下creatlink函数建立一个带头结点的单向链表, 并用随机函数为各个结点赋值。函数fun的功能是将单向链表结点数据域为偶数的值累加起来, 并作为函数值返回。

四、指针运用的常见错误

4.1混淆了*号在指针中的两个含义

初学者很容易把C语言中的所有*号都理解为指针运算符, 实际上, *号在指针中有两个含义:在变量声明部分是指针声明符, 只起声明变量作用;在语句执行部分是指针运算符, 是取指针所指向的存储单元的作用。

上例中*p1=&a, *p2=&b;显然不合法, 因为在执行语句中的*号是指针运算符, *p1, *p2表示p1, p2所指向的对象, 编程者的意图是把a和b的地址赋给p1和p2, 而不是它们指向的对象, 所以应把*号去掉, 第四行语句则应改为“p1=&a, p2=&b;”。

当然, 也可以在定义指针的时候赋初值, 将程序改为:

程序中也存在“*p1=&a, *p2=&b”, 但这是正确的对p1, p2进行初始化的语句, 因为此语句出现在变量声明部分, 此时*号是变量声明符, 所以不能把*p1, *p2看成是p1, p2所指向的对象。程序实际上是把a和b的地址分别赋给了说明为指针变量的p1和p2。

4.2分不清指针的类型

指针的类型较繁杂, 因此, 在学习中, 注意分清*号的优先级是初学者正确区分复杂指针类型的一条有效途径。

例:int*p1[n];int (*p2) [n];int*p3 () ;int (*p4) () ;int**p5;

要区分这些变量的含义首先从与运算符的结合性入手, 步骤如下:

第一、先看变量名首先与哪个运算符相结合, 确定它是否为指针变量。四个变量中先与说明符*结合的表明是指针变量, 先与[]结合的表明是一个数组, 先与 () 结合的表明是一个函数。因为[]和 () 的优先级高, 所以p1和p3是数组和函数, 而p2, p4和p5是指针变量;

第二、再根据变量名与次运算符的结合确定变量的具体含义, 所以它们的含义分别是:

p1是数组, 它由n个指向整型数据的指针元素组成;

p2是指针, 它指向含n个元素的一维整型数组;

p3是函数, 它的返回值为一个指向整型数据的指针;

p4是指针, 它指向一个返回整型值的函数;

p5是指针, 它指向一个指向整型数据的指针变量, 是一个二级指针。

总之, 要区分指针的类型, 首先要确定这个变量是否为指针, 关键就是看在定义的时候是否先与*号结合。

五、结束语

指针是C语言最具特色的语言成分, 也是C语言的精华, 当学生理解了指针的内涵, 掌握了指针的基本概念及相关操作后, 还要让学生学会如何运用指针解决实际问题。

参考文献

[1]谭浩强, C程序设计 (第二版) 北京:清华大学出版社, 1989

[2]周强, 如何正确理解和使用C语言指针, 2005

c语言之define用法 第6篇

In China’s main urban centers, Beijing and Shanghai, the middle class accounted for 46 percent and 38 percent, respectively, of the local population.

The report, published by the Chinese Academy of Social Sciences (CASS), defines the middle class as people who spend only 30 to 37.3 percent of income on food. More specifically, the report’s lead author, Zhang Lifeng, said they are mostly people in households with a per-capita annual disposable income of between 16,300 yuan ($2,556) and 37,300 yuan ($5,848).

Tan Tan, a young staff in a private company in Beijing with a monthly salary of 5,100 yuan ($800), belongs to the middle class category as defined by the report. But she said she didn’t feel “middle class” at all.

Tan spends about two thirds of her disposable income on daily necessities, such as rent, utilities, food, clothing, transportation and phone bills. She saves about 17,000 yuan ($2,665) a year on average.

She believes “middle class” refers to a lifestyle far removed from her own. Facing rising housing prices and inflation, Tan said she found her finances constantly stretched and didn’t have the peace of mind with which she associates a middle-class lifestyle.

“I do not own a house. The money I save in a year is not enough to buy 1 square meter of living space,” Tan said.

Like Tan, many statistically qualified middle-class Chinese people are struggling to pay mortgages, cars, medical bills and their children’s education.

Vague definition

Although the term middle class is widely used, there is no universally accepted definition for it.

The middle class in other countries is usually defined by income and occupation, said Zhang, lead author of the CASS report and a researcher with the academy’s Institute for Urban and Environment Studies.

“The American middle class consists of households with an income between$40,000 and $200,000, which accounts for 80 percent of the country’s population, while the German middle class includes households with an income between $30,000 and$800,000, or about 55 percent of the population,” she said.

The first references to a modern Chinese middle class were made in the late 1980s after China implemented the reform and opening-up policy. Only since the turn of the century have mainstream Chinese scholars been studying the middle class, said Cheng Li, a senior fellow at the U.S.-based Brookings Institute.

According to international standards, to be middle class in a developing country requires a daily income of between $4 and$6, said Li Shi, a professor at the School of Economics and Business Management of Beijing Normal University.

By this standard, China has a very large middle class, but the accuracy of this standard is debatable as developing countries vary wildly.“Whether China has a middle class is contingent on how we define it,” Li said.

Chinese researchers usually use income, profession and education as most essential criteria in determining middle-class status, and some scholars also use consumption level in their studies.

In 2005, the National Bureau of Statistics

released a survey, which showed the urban middle class should have an annual income between 60,000 yuan ($9,405) and 500,000 yuan ($78,376). At the time the bureau estimated that the middle class constituted 5 percent of urban Chinese residents.

In her newly published report, Zhang classified households with an Engel’s Coefficient of between 0.3 and 0.373 as middle class. The Engel’s Coefficient refers to the share of food in total household expenditure.

Zhang chose to use consumption level rather than income as a measure of middleclass status, because, she said, Chinese citizens are often hesitant to disclose their full incomes, and there are huge disparities in living costs between China’s regions.

According to the UN Food and Agriculture Organization, the Engel’s Coefficient for the richest segment of society is typically below 0.3 and for the wealthy stands at between 0.3 and 0.4. Zhang said she chose the 0.3 to 0.373 range for China’s middle class after taking into account Chinese citizens’ consumption and living patterns and China’s socio-economic system.

But Zhang’s conclusion that China had 230 million middle-class urban residents in 2009 has been widely criticized. A netizen known as Wuyue Sanren said the Ministry of Finance’s (MOF) statistics show only 24 million people in China make more than 3,500 yuan ($549) per month, the personal income tax exemption threshold effective

on September 1. “How can a person with income below the income tax exemption threshold level qualify as a middle class?”Wuyue Sanren said.

Zhang said the MOF’s data were based on individuals’ reported incomes, while hers were based on household spending. Since many Chinese people have off-book income, Zhang said she believed household spending provides a more accurate picture of people’s lifestyles.

Wang Jian, Secretary General of the Chinese Society of Macroeconomics of the National Development and Reform Commission, said he thought Zhang’s estimate was more or less accurate.

Wang admitted China’s present high inflation had placed an enormous strain on all citizens, but he said even struggling mortgage payers remained middle class in comparison to people who cannot even afford a down payment. Painstaking growth

“Currently, the shape of China’s income structure is not an olive with a bulging middle and tapering ends, but a pyramid with a large group of low-income people at the bottom,” said Li at Beijing Normal University.

But Zhou Tianyong, a professor at the Party School of the Central Committee of the Communist Party of China, tends to believe China’s income structure takes an inverted T shape, with the middle to high-income popu- lation constituting the vertical bar and the bulk of the people being the horizontal bar at the bottom.

Zhou said the best way to produce an olive-shaped income structure in China is to boost the growth of small and medium-sized enterprises.

“In China, the number of owners and managers of small and medium-sized enterprises is relatively small, as the growth of small and medium-sized enterprises is inhibited by heavy taxes and difficulties in fundraising,” Zhou said.

Using data released by the State Administration for Industry and Commerce, Zhou calculated China had 12 enterprises per thousand people, whereas China’s Taiwan and South Korea each had 50 enterprises per thousand people.

“If China has 50 enterprises per thou

sand people and each company is run by at least two people, then one 10th of the country’s population will be middle class,”he said.

China’s growing income disparity between a high-income elite and the struggling remainder of the population remains an impediment to changing the structure of the country’s income pyramid.

“With the growing income gap, it is difficult to have a fast-growing middle class, said Chi Fulin, a researcher with the China Institute for Development and Research, a think-tank based in south China’s Hainan Province.

Chi believes a rapid expansion of the middle class will only happen if China increases wages in its service and hi-tech sectors. “It is difficult for an economy dominated by investment and industry rather than services to breed a mass middle class,” he said.

According to Bai Chongen, a professor at the Tsinghua University’s School of Economics and Management, the share of household income in total national income dropped from 63 percent in 1993 to 52 percent in 2007, whereas in the same period, the share of government revenues increased 9 percentage points, and that of enterprises’ income went up 2 percentage points.

He called on the government to increase expenditure on public programs and distribute dividends of state-owned enterprises to citizens, saying these efforts will greatly reduce the burden on citizens.

维C泡腾片 用法有讲究等 第7篇

维C泡腾片加水后,柠檬酸与碳酸氢钠反应,释放二氧化碳,因而会有许多气泡冒出水面。维生素C是水溶性维生素,性质不稳定,易氧化变质、分解失效。如果用100℃的开水冲服,维生素C的含量就所剩无几。所以,正确的方法是用40摄氏度的温水冲泡,如此维生素C才不会遭到破坏。

有些人常用茶水或饮料冲泡腾片,这样做也不对。因为常用的泡腾崩解剂是由碳酸氢钠与枸橼酸组成的,而茶水中含有的茶碱等成分,会与维生素C或崩解剂起化学反应。饮料中则一般含有苯甲酸钠,也会与维生素C起反应而产生有害物质苯。

维C泡腾片不可长期大剂量服用。长期大剂量服用维生素C,在体内被分解成的最终产物为草酸及二氧化碳,草酸在尿中生成草酸盐,易形成结石。此外,高浓度的维生素C使尿液酸度增高,在结石的形成中也起到了推波助澜的作用。长期口服大剂量维生素C还会给人体带来一些副作用,如恶心、呕吐、腹泻、腹痛、皮疹等:还能促进动脉硬化,服用剂量越大,动脉壁增厚的速度越快。长期大量服用者突然停药,还可能出现维生素C缺乏的症状。市场上的维生素C泡腾片多是单片1克的片剂,因此,连续服用最好不要超过5天。

与便秘患者说说泻药的事儿 韩咏霞

泻药被人们认为是安全有效的治疗便秘的药物,但是很少有人注意到泻药的分类、作用特点和注意事项,这样使用起来盲目性很大,容易造成药物使用不当,导致不良反应。

容量性泻药代表药物是甲纤维素。作用特点是使水进入结肠,增加粪便湿度,促使粪便膨胀,从而刺激结肠黏膜感受器,增强肠蠕动,缓解便秘。对干结而硬的粪便有效,适用于分娩后及老年便秘患者。但通常需要几天才能发挥作用,因而不能指望用药后立即缓解便秘;糖尿病患者不要使用这类药物,尤其是含糖成分的容量性泻药;服药期间必须多喝水,才能取得良好效果。

渗透性泻药代表药物是硫酸镁、乳果糖和聚乙二醇等。作用特点是通过减少肠道对液体的吸收而使结肠膨胀,蠕动增快,软化粪便,缓解便秘。适用于单纯性便秘、术前肠道清洁和肠道准备患者。但慢性肾脏疾病患者应慎用硫酸镁等含镁制剂,防止加重肾损害;服药期间注意多饮水,如果用药时间长,要注意水电解质紊乱的风险;谨防过敏反应,如果服药后出现瘙痒、荨麻疹和过敏性鼻炎,必须立即停药并给予抗组胺药对症处理。

润滑性泻药代表药物是液体石蜡。作用特点是在粪便与结肠壁之间产生间隔,防止粪便丧失液体,使得粪便松软,容易排出。适用于那些禁止用力排便的患者,如心绞痛、动脉瘤、中风和腹部手术后的患者;对那些因痔疮引起便秘的患者也有较好疗效。但不要长期使用,以免引起维生素和钙、磷吸收障碍。

刺激性泻药代表药物是番泻叶。作用特点是通过神经刺激增加肠道运动,促使结肠蠕动而缓解便秘。适用于长期卧床及不良习惯所致的便秘,也可用于手术前的肠道准备。但应避免过量使用,防止引起肠激惹综合征;不要长期服用,避免诱发腹泻而致水电解质紊乱;老年患者慎用,尤其不可将番泻叶当茶喝。

c语言之define用法

c语言之define用法(精选7篇)c语言之define用法 第1篇C语言之define用法总结#define是C语言中提供的宏定义命令,其主要目的是为程序员在...
点击下载文档文档内容为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部