第 10 章 指针与函数
- 格式:doc
- 大小:34.50 KB
- 文档页数:2
第十章指针一、选择题1.以下程序的运行结果是【C】。
sub(int x,int y,int *z){*z=y-x ;}main(){ int a, b,c;sub(10,5,&a);sub(7,a,&b);sub(a,b,&c);printf(”%4d,%4d,%4d\n”,a,b,c);}A. 5,2,3 B. -5,-12,-7 C.-5,-12,-17 D. 5,-2,-72.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是【 B 】A)s+1 B)s++ C)&s[0]+1 D)&s[1]3.下列程序能对两个整型变量的值进行交换。
以下正确的说法是【 D】。
main(){ int a=10,b=20;printf("(1)a=%d,b=%d\n",a,b);swap(&a,&b);printf(“(2)a=%d,b=%d\n”a,b);}swap(int p, int q){ int t; t=p;p=q;q=t;}A. 该程序完全正确B. 该程序有错,只要将语句swap(&a,&b);中的参数改为a,b即可C. 该程序有错,只要将swap()函数中的形参p和q以及t均定义为指针(执行语句不变)即可D. 以上说法都不正确4.有四组对指针变量进行操作的语句,以下判断正确的选项是【】。
(1)int *p,*q; q=p;int a,*p,*q;p=q=&a;(2)int a,*p,*q; q=&a; p=*q;int a=20, *p; *p=a;(3)int a=b=0,* p; p=&a; b=* p;int a=20,*p,*q=&a; *p=*q;(4)int a=20,*p,*q=&a; p=q;int p, *q; q=&p;A.正确:(1);不正确:(2),(3),(4)B.正确:(l),(4);不正确:(2),(3)C.正确:(3);不正确:(1),(2),(4)D.以上结论都不正确5.以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是【】。
函数、指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同。
指针函数指针函数的本质是一个函数,其返回值是一个指针。
示例如下:int *pfun(int, int);由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。
即:int *(pfun(int, int));接着再和前面的“*”结合,说明这个函数的返回值是一个指针。
由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。
指针函数示例程序如下:#include <stdio.h>//这是一个指针函数的声明int *pfun(int *arr, int n);int main(void){int array[] = {0, 1, 2, 3, 4};int len = sizeof(array)/sizeof(array[0]);int *p;int i;//指针函数的调用p = pfun(array, len);for (i = 0; i < len; i++){printf("array[%d] = %d\n", i, *(p+i));}return 0;}//这是一个指针函数,其返回值为指向整形的指针int *pfun(int *arr, int n){int *p = arr;return p;}程序运行结果如下:主函数中,把一个数组的首地址与数组长度作为实参传入指针函数pfun里,把指针函数的返回值(即指向数组的指针)赋给整形指针p。
最后使用指针p来遍历数组元素并打印输出。
函数指针函数指针其本质是一个指针变量,该指针变量指向一个函数。
C程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
函数指针示例:/*声明一个函数指针 */int (*fptr) (int, int);/* 函数指针指向函数func */fptr = func; // 或者fptr = &func;func是一个函数名,那么func与&func都表示的是函数的入口地址。
第10章指针与函数10.1 函数的参数为指针
概念:一般调用函数通过函数名返回一个具体的数,而此处是返回一个地址
定义函数格式:
类型名*函数名(形参表)
{
函数体
return(e);
}
此处的e是一个指针变量或一个对象的地址
例:
int *max(x,y)
在函数名前加一个*
注意:
此函数是返回地址,那么于return之后的e的值要对应
10.3 函数的指针
因为函数也要占内存,所以也存在地址,用函数地址的目的是通过函数指针调用函数
定义格式:
设有一个函数,max(x,y)
int (*p)(类型表);
p=max;将函数nax的地址赋给p
10.4 指针数组和指针的指针
1、指针数组
定义一串存放地址的元素。
int *p[5]; (*p)[5]
其中每个元素均存放地址
例:10.16
2、指针的指针
专门存放指针变量地址的变量
格式:
int x,*p,**pp;
x=90;
p=&x;
pp=&p;
*p的值是90
**pp的值也是90
而p的值是x的地址
*pp的值是p的内容及x的地址
10.5主函数带参数
因为其它函数不能调用主函数,所以主函数代参数必须通过dos调用赋实参(1)、定义主函数代参数:
main(int n,char *c[])
其中:只能是2个形参
第一个是一个整型变量
第二个是一个无大小的字符指针数组
他们的值是通过dos调用得到
(2)、调用的格式
程序名,实参表
实参之间用空格分开。
当调用完后,n的值是实参个数加1
c的值是程序名及个实参名(均当字符处理)
main(int n,char *c[])
{
int a;
for(a=0;a<n;a++)
printf(“a=%d %s\n”,a,c[a]);
}。