第七章 函数
本章重要知识点:
1. 一个变量的地址称为该变量的指针。 指针变量定义的一般形式为: 类型标识符 *变量名
int *i_point;
2. * 在定义语句中只表示变量的类型是指针,没有任何计算意义。 * 在语句中表示“指向”。&表示“地址”。
3. 指针变量只能存放地址,不要将非地址数据赋给指针变量。 int *p; p=100;
4. ++, - -, * 优先级相同,都是右结合性。 int a=3, *p; p=&a;
(1)(*p)++; 相当于a++。表达式为3, a=4
(2)*p++; *(p++)首先*p ,然后p=p+1,指针指向下一个int单元 表达式为3, (3)++*p ++(*p) *p=*p+1 a=4
(4)*++p *(++p),首先:p=p+1, 然后取*p。即取p所指的下一个int单元的内容。 5. 指针变量作为函数参数
(1)函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。 (2)指针变量作为函数参数与变量本身作函数参数不同,变量作函数参数传递的是具体值,而指针作函数参数传递的是内存的地址。
(3)用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,这样,函数在调用结束后,其变化值才能保留回主调函数。
(4)函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。 (5)用指针变量作函数参数,可以得到多个变化了的值。
注意:如果函数的形参是指针类型,那么实参传递过去的一定是地址(二级上机改错题必考类型)
6. 数组的指针和指向数组的指针变量
数组名就是数组的起始地址;又规定:数组的指针就是数组的起始地址。数组元素的指针就是数组元素的地址。
(1)指向数组元素的指针变量的定义与赋值 int a[10], *p; p=a;
(2) p+1指向数组的下一个元素,而不是下一个字节
7. 数组名作函数参数(重点,难点) (1)数组名可以作函数的实参和形参,传递的是数组的地址。这样,实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调函数内。 (2)在函数调用时,形参数组并没有另外开辟新的存储单元,而是以实参数组的首地址作为形参数组的首地址。这样形参数组的元素值发生了变化也就使实参数组的元素值发生了变化。
8. 指向二维数组的指针和指针变量
int a[3][4];
(1)a为二维数组名,a+1为a[1]的地址,也就是数组第一行的地址,所以a为行指针。a为行指针,加1移动一行。 (2)a[1]为一维数组名,a[1]+1为a[1][1]的地址,也就是数组第一行第一列的地址, 所以a[1]
为列指针。
(3) *a或a[0]为列指针,加1移动一列
(4) a, a+0 , *(a+0), a[0], &a[0][0]表示的都是二维数组的首地址。 (5) 注意二维数组的各种表示法,a为常量。*(a+i)与a[i]等价
9 指向由m个整数组成的一维数组的指针变量,int (*p)[m];
注意,p为行指针,可以直接将二维数组名a赋给p。这样,a与p等同。如有a[n][m],可以令p=a;
10. 字符串的指针和指向字符串的指针变量 (1) char string[ ]=“I love China”;(合法,string为数组名,代表数组的首地址,是常量。) (2) char string[20];
string=\非法表示,常量不能赋值) 正确的写法:strcpy(string, \(3) 用字符指针表示字符串
char *string=“I love China”;(合法,将内存中字符串常量的首地址赋给一个指针变量) 另一种写法:char *string; string=“I love China”;(指针变量赋值,合法)
第3种写法:char *string; gets(string);(非法,指针未赋值就作指向运算)
11. 函数的指针和指向函数的指针变量
(1)函数在编译时被分配给一个入口地址。这个入口地址就称为函数的地址,也是函数的指针。
像数组一样,C语言规定,函数名就代表函数的入口地址 (2) 专门存放函数地址的指针变量称为指向函数的指针变量 函数类型 (*指针变量名)(参数类型 ); int (*p)( int, int); int max (int x, int y)
{ return x>y?x:y; }
p=max;(
这时,指针变量p中放的是max函数在内存中的入口地址。)
12. 返回指针值的函数
(1) 被调函数返回的不是一个数据,而是一个地址。所以函数的类型为指针类型。 类型标识符 *函数名(参数表) 13. 指针数组和指向指针的指针
(1) 指针数组中的每一个元素都是指针变量,可以放地址。 类型标识 *数组名[数组长度说明] int *p[4];
p为数组名,内有四个元素,每个元素可以放一个int型数据的地址
(2)指向指针的指针变量(或称为二级指针) int i,*p; p=&i;
同样,p也有地址,可以再引用一个指针变量指向它。 prt=&p;
称prt为指向指针的指针变量。其基类型是指向整型数据的指针变量,而非整型数据。
总结:
(1)指针变量可以有空值,即指针变量不指向任何地址 p=NULL
(2) 两指针可以相减,不可相加。若要进行相减运算,则两指针必须指向同一数组,相减结果为相距的数组元素个数
(3) 指向同一数组的两个指针变量可以比较大小
(4) 通过行指针引用二维数组元素(本章的难点,重点) int a[3][4], *p[3], (*pp)[4], **prt; for(i=0;i<3;i++) p[i]=a[i]; pp=a; prt=p;
(1)a:二维数组名,常量 (2)p:指针数组名,常量
(3)pp:指向具有四个元素的一维数组的指针变量 (4)prt :指向指针的指针变量
【程序1】在计算机调试以下程序并填空,理解指针的定义。 知识点:(1)什么是指针;(2)定义指针;(3)引用指针
#include \void main(){
int a=10,b=10; int *p1,*p2; p1=&a; p2=&b;
printf(\ printf(\
//a=____;b=____ //a=____;b=____
printf(\//a=____;b=____ }
【程序2】调试下面两段功能相同的程序,请用一句话描述两段程序的区别。