王 宣
1)C 语言。在1972 年开发Unix 操作系统时,丹尼斯里奇和肯汤姆逊设计了C 语言。C 语言不完全是里奇突发奇想而来,他是在汤姆逊发明的b 语言的基础上进行设计。把C 语言作为程序员的编程工具是它设计的初衷,因此它的主要目标是成为一种有用的语言。作为面向过程抽象化的通用编程语言,C 语言在底层开发中得到了广泛的应用。C 语言可以进行简单地编译和处理低级内存,是一种高效的编程语言,它只产生少量的机器语言,可以在没有任何运行环境支持的情况下运行。
2)指针。C 语言中最重要的概念之一就是指针。它用于存储变量的地址,地址在scanf()函数中作为参数。一般来说,如果主函数不使用返回值,则必须对其进行寻址以修改主函数中的值。
3)函数。函数是执行特定任务的独立程序代码单元。函数的结构和用法已经被C 语言的语法规则定义了。函数在C 语言中的细节略有不同。某些函数执行操作,如printf()的作用是将数据打印在屏幕上显示出来,而一些函数则查找直接程序以供使用,如strlen(),向程序返回指定字符串的长度。
从根本上看,指针是一个值为内存地址的变量,正如char 类型变量的值是字符,int 类型变量的值是整数,指针变量的值是地址。
与指针相关的运算符:
&,当&后面跟一个变量名时,&给出的是变量的地址。示例:变量ph 的地址由&ph 表示。
*,当*后跟指针名称或地址时,*给出的是指针储存的地址上的值。示例:
ptr=&ph;//把ph 的地址储存在ptr
val=*ptr;//将ptr 指向的值(ph 的值)赋值给val
这两条语句等价于将ph 的值赋给val,即val=ph。
函数的参数有多种数据类型,不仅可以是字符型数据,还可以是指针型数据。指针型数据的作用是将一个变量的地址从一个函数传递给另一个函数。实参与形参之间的数据传递在C 语言中是单向的“值传递”。
例:
interchange()使用的变量并不是main()中的变量。因此交换a 和b 的值,对x 和y 的值没有影响。如果使用return 语句,可以将被调函数的值返回到主函数,但是只能返回一个值,故现在必须使用指针来返回两个值。
例:
该程序输出为:
originally x=5 and y=10.
now x=10 and y=5.
interchange(&x,&y)该函数传递的不是x和y 的值,而是他们的地址。
viod interchange(int *a,int*b)是函数的声明。
接下来在函数体中声明了一个交换值时必须的临时变量,int temp;
temp=*a;把x 的值赋值给temp,a 储存的是x 的地址,则*a 表示的是a 储存的地址对应的值,即x 的值。
把y 的值赋给x,*a=*b;这条语句相当于x=y。
*b=temp;把temp 的值赋给y。
函数可以返回整型数据、字符型数据,同时还可以返回指针型数据。指针函数返回的就是指针型数据。它的一般定义如下:
类型名 *函数名(函数参数表列);
其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。
例:将字符串s1 与s2 拼接
char *str(char *p1,char *p2);为定义一个函数,其返回值为char 类型的指针。
该函数的功能是将字符串s1 与字符串s2 拼接起来。
while(*p1)
p1++;
当s1 有字符时*p1 非零,循环不断进行,使指针p1 向后移动。当指针移动到s1 结束时,*p 为零,循环停止。
接着执行while(*p2)
当*p2 非零时,将*p2 赋值给*p1,同时,指针p1,p2 一起向后移动,如此循环,直到*p2 为0(指针p2 处于s2 结尾处),停止循环,实现s1 与s2 的拼接。
return temp;将s1 与s2 拼接好的字符串的地址返回。
程序编译后,每个函数都有执行第一条指令的地址即首地址,称为函数指针。函数指针即指向函数的指针变量,要间接调用函数可以使用指针变量来实现。
int (*pf)(int,int);
通过将pf 与括号中的“*”强制组合组合在一起,表示定义的pf 是一个指针,然后与下面的“()”再次组合,表示的是该指针指向一个函数,括号里表示为int 类型的参数,最后与前面的int 组合,此处int 表示该函数的返回值。因此,pf 是指向函数的指针,该函数的返回值为int。函数指针与返回指针的函数的含义大不相同。函数指针本身是一个指向函数的指针。指针函数本身是一个返回值为指针的函数。
例:
float (*p)(float x,float y);定 义 了 一个指向函数的指针变量。首先c=(*p)(a,b);语句:因为指针p 储存的是max 函数的首地址,(*p)(a,b)就相当于max(a,b),函数返回较大值。其次c=(*p)(a,b);语句:因为指针p 储存的是min函数的首地址,(*p)(a,b)也就相当于min(a,b),函数返回较小值。