作者:陈显亭
本次课内容:指针与函数
教学目的:掌握作为函数参数的指针、数组指针、指向函数指针的
引用方法,main函数参数的使用方法。重点:函数实参、形参为
指针时的应用。
难点:实参和形参为指针时的对应关系。
预习:一维数组元素的引用方法,
(1)下标法,a[ i ] (2)地址法,*(a+i)
(3)用指针变量,int *p,a[5]={1,3,5,7,9};
p=a;
printf(“%d”,*p);
二维数组指针表示方法:如,int *p,a[3][3];
在此定义中若 0<=i<3,0<=j<3,则 a[ i ][ j ]的地址可
用以下五种表达式求得,引用
(1) &a[ i ][ j ] a[ i ][ j ]
(2) a[ i ]+j *(a[ i ]+j )
(3) *(a+i )+j *(*(a+i)+j)
(4) &a[0][0]+3*i+j *(&a[0][0]+3*i+j )
(5) a[0]+3*i+j ( *(a+i))[ j ]
一、指针作为函数的参数
1、实参为地址,形参为指针变量
main()
{
void sub (int *px,int *py);
int x,y;
sub(&x,&y);
printf(“%d,%d \n”,x,y);
}
void suv(int *px,int *py)
{
*px=10;
*py=20;
}
结果,10,20
px
py
1012
1014
x
y
10
20
1012
1014
2、实参为数组名,指针变量,形参为指针变量
#define N 10 /*例 p203_6.19*/
main()
{
void max_min( int arr[ ],int *pt1,int *pt2 );
int array[N]={1,8,10,2,-5,0,7,15,4,-5},*p1,*p2,a,b;
p1=&a;p2=&b;
max_min(array,p1,p2,N);
printf(“max_=%d,min=%d”,a,b);
}
void max_min( int arr[ ],int *pt1,int *pt2,int n)
{ int i;
*pt1=*pt2=arr[0];
for (i=1;i<n;i++)
{ if (arr[i]>*pt1) *pt1=arr[ i ];
if (arr[i]<*pt2) *pt2=arr[ i ];
}
}
&a
p1 a
&b
p2 b
&b pt2 &a pt1 array
arr
array
1 8
10 2
3,实参为指向数组的指针变量、形参为数组
main()
{ int arr_add(int arr[ ],int n);
static int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p,total;
p=a[0];
total=arr_add(p,12);
printf(“total=%d\n”,total);
}
arr_add(int arr[ ],int n)
{ int i,sum=0;
for ( i=0;i<n;i++)
sum+=arr[i];
return(sum);
}
运行结果,
total=144
arr[0]
arr[8]
arr[9]
arr[10]
arr[11]
arr[3]
arr[4]
arr[5]
arr[6]
arr[7]
arr[1]
arr[2]
a[0][0]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
a[0][1]
a[0][2]
a[0][3]
1
3
5
7
9
11
13
15
17
19
21
23
地址 元素 &a[0][0] p,arr,
&a[0][0] p
a[0]
&a[0][0] arr
二、指向函数的指针
1、指向函数的指针变量的定义格式
类型标识符 ( *指针变量)();
如,int (*p)( );
2、指针变量指向函数
设有函数 fun1,p为指向函数的指针变量
则 p=fun1; /*p指向函数入口地址 */
3、指向函数指针调用函数
格式,( *指针变量)(实参数)
如,( *p )(a,b);
例 P212_例 6.25
三、返回指针值的函数
函数的返回值是指针。
函数的定义格式,类型符 *函数名(形参,… )
如,int *fun(int a,int b)
返回值为指向一个整型数据的指针。
例 P217_例 6.28
四,main函数中的参数
main中可带参数,格式,
main(int argc,char *argv[ ] )
说明,
argc,存放字符串个数的整型变量。
*argv[ ],存放各字符串首地址的指针数组。
argc和 argv两名字可以自己定义,但类型是固定的。
例:设有 C源程序 myc.c,主函数包含有如上参数,进行编
译连接后生成的可执行文件为 myc.exe。
执行 myc.exe时,打入以下命令执行该程序,
myc
此时参数 argc的值为 1,argv[0]中存放的字符串为,myc”的首
地址。
若打入,
myc ok good<CR> ( <CR>代表 enter键)
此时参数 argc的值为 3,argv[0]中存放,myc”字符串的首地
址,argv[1]中存放,ok”串的首地址,argv[2]中存放,good”
串的首地址。例 P220_例 6.30
小结,
1、指针作为函数参数
2、函数返回指针
3、指向函数的指针
4,main函数中的参数
指针数据小结
一、常用 的指针类型变量归纳
int *p ; p为指向整型数据的指针变量。
Int (*P)[n] ; P为指向含 n个元素的一维数组
的指针变量。
Int (*P)( ); P为指向函授数的指针,该函数
带回一个整型值。
Int *P[n]; P为包含 n个元素的指针数组,
每个元素指向一个整型数据。
Int *P( ); P为带回一个指针的函数,该指针指向
整型数据。
Int **P; P是一个指针变量,它指向一个指向整
型数据的指针变量,即指向指针的指针。
Int (**P)[n]; P是一个指向另一个指针变量的
指针变量,被指向的指针变量 指向一个含 N个整型数据的
一维数组。
二、指针的运算
指针的运算,
指针与整数相加减
同一数组中各元素地址间的关系运算与相减运算
赋值运算
1、指针与整数相加、减
指针与整数相加减,表示指针在内存空间向下、
上移动,移动以其类型长度为单位。
如,int *P;
指针加 1,向下移动 2个字节,减 1,向上移动 2
个字节。
2、指针同一数组中的元素的指针的关系运算与相减运

两个指向同一数组中的元素的指针相减,是计算
它们之间的元素数目。
3、指针赋值
指针通过赋值运算改变其所指向的实体。
(1)给指针赋以一个对应类型的变量地址
如,int a,*p;
p=&a;
(2)同类型指针间的赋值
如,int a,b,*p1,*p2;
p1=&a,p2=&b;
p1=p2;
(3)指针增 1,减 1,即指针向下或向上移动一个所指向
的数据类型空间。
增 1减 1运算符与 *优先级相同,它们在同一表达
式中时,按结合性决定运算顺序。
如,int y,*px,a=5; px=&a;
*(px+1)=10;
y = * + + px
y = + + * px
10 6
三、指向 void类型的指针
void为空类型指针,不指定指针指向一个固定
的类型。
如,void *p;
*p的作用仅是存放地址。
如,int *p1;
void *p2;
int i;
p2=(void*)&i;
p1=(int *)p2;
如,void *f(int x,int y)
函数 f带回的是一个, 空类型, 的地址。