指针与数组 函数的组合
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指针和数组
∙
∙ 1.指针数组:是其数组元素为指针的数组。记住:是一个存放着指针的数组,而不是一个指针
∙定义格式为:数据类型* 数组名[数组长度]
∙如:int * a[10] ; [ ]的优先级高于*,意味着使得a是一个指针数组,表示具有10个元素的数组,每个元素是一个指向int 型的指针。
∙
∙2,指向数组的指针:是一个指针,指向的是一个数组。
∙定义格式为:数据类型(*数组名) [数组长度]
∙如:int (*a) [10];*先于a 结合,意味着a 是一个指针,指向具有10个int 值的数组,
∙
∙
∙指针与函数
∙
∙1, 函数的指针:首先它是一个指针,指向函数的入口地址;在C语言中,函数名就是来标识函数的入口地址。
∙与指向数组的指针不同,在数组中,可以对数组中的元素访问,可以进行算术运算。
而在函数中,只需考虑函数的入口地址,而不考虑函数中某具体指令或数据所在存
储单元的地址,即不能进行算术运算
∙定义格式:存储类型数据类型(*函数名) ( )
∙如:static int (*p) ();
∙存储类型表示函数在文件中的存储方式
∙数据类型表示被指函数的返回值的类型
∙最后的空括号表示指针变量所指的是一个函数
∙
∙如何用指向函数的指针变量的方式来调用相应的函数:
∙1), 使用前,必须先定义并赋值
∙2), 指向函数的指针定义形式中的数据类型必须和赋给它的函数返回值类型相同
∙3), 指向函数的指针只能指向函数的入口,而不能使用*(p+1) 来表示函数的下一命令∙4), 在函数指针赋值时,只需给出函数名而不需给参数,如p = max;
∙5), 调用时,只需将(*p) 代替函数名即可,在p 后面的括号中根据需要写上实参,如:
c = (*p) (a,b) ;
∙如下程序:求直角三角形的斜边
∙#include
∙ #include
∙main()
∙{
∙ int a ,b ,c , f() , (*f1)();
∙ a = 3; b = 4;
∙f1 = f;
∙ c = (*f1) (a,b);
∙printf("c = %d\n",c);
∙}
∙ f (int x , int y)
∙{
∙int z;
∙z = sqrt((double)(x*x + y*y));
∙return (z);
∙}
∙
∙2, 指针函数:返回指针值的函数称为指针型函数,记住:它是一个函数,只不过返回值是个指针。
∙定义一般形式为:类型说明符* 函数名()
∙ {
∙ /* 函数体*/
∙ }
∙如:int * ap (int x , int y)
∙ {
∙ /* 函数体*/
∙ }
∙()的优先级比* 高,ap先于() 结合,说明ap 是个函数,返回的指针变量为整型。
∙main()
∙{
∙int i;
∙char * day_name (int n);
∙printf("input Day NO. : \n");
∙scanf("%d ",&i);
∙if(i < 0)
∙exit(1);
∙printf("DayNo.: %2d -- >%s\n", i, day_name(i));
∙}
∙char * day_name(int n)
∙{
∙static char * name[]={"Illegal day","Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
∙return ((n < 1 || n >7)) ? name(0):name[n];
∙}
∙
∙3, 指针型函数与指向函数的指针的区别
∙如int (*p)()和int *p()
∙1), int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型值,(*p)两边的括号不能少。
∙2), int *p()则是函数说明,说明p 是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号
∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙