黑马程序员-----指针函数和函数指针

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -----

第一讲 指针函数

一、指针函数的概念

所谓函数类型是指函数返回值的类型,在c语言中允许一个函数的返回值是一个指针(地址),这种返回指针的函数称为指针型函数。

二、指针函数的定义

定义指针型函数的一般形式为:

int  *sum(int a,int b){

}

类型说明符  *函数名(形参表){

/*函数体*/

注意:返回值是一个指针。

 1 /*
 2      指针函数:
 3
 4         返回值是指针的函数
 5
 6     指针函数的定义:
 7
 8         指针类型 *函数名(){
 9
10               return 地址;
11       }
12
13 */
14 #include <stdio.h>
15
16 //返回的是两个数中大数的地址
17 //返回的是形参x和y的大数的地址
18 int *max(int x, int y){
19
20     printf("x = %p\n",&x);
21     printf("y = %p\n",&y);
22     return x>y?&x:&y;
23 }
24
25 int *max2(int *x, int *y){
26
27         printf("max x = %p\n",x);
28     printf("max y = %p\n",y);
29     return *x>*y ?x :y;
30
31 }
32 int main (int argc , const char * argv[]) {
33
34     //返回a 、b两个数中大数的地址
35         int a=3,b=4;
36     printf("a = %p\n",&a);
37     printf("b = %p\n",&b);
38         int *p = max2(&a,&b);
39     printf("p = %p\n",p);
40
41     return 0;
42 }
43 //证明了  调用函数的时候形参变量是新分配的空间
44 //  实参和形参只是值传递

应用题:

 1 /*
 2     思考&实现1:
 3
 4            通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
 5
 6 */
 7 #include<stdio.h>
 8
 9 char *getDay(int n){
10
11 //定义一个字符串指针数组
12 char  *days[] = {
13
14        "星期一",
15        "星期二",
16        "星期三",
17        "星期四",
18        "星期五",
19        "星期六",
20        "星期日"
21
22 };
23
24   return n>=1&&n<=7?days[n-1]:"输出错误!";
25
26 }
27   int main (int argc,const char *argv[]){
28
29    printf("%s\n",getDay(3));
30    return 0;
31 }
32
33
34 /*
35  思考&实现2:
36
37        用指针变量作为函数的参数,求出10个数的最大值。
38 */
39
40 #include<stdio.h>
41
42 int getMax(int *p,int len){
43      int  max = *p;
44           for(int i = 1;i<len;i++){
45                if(*(p+i)>max){
46
47                 max = *(p+i);
48
49              }
50        }
51     return max;
52 }
53 int main(int argc,const char *argv[]){
54
55      int a[10]={123,35,65,485,554,12,354,471,74,111};
56      int m = getMax(a,10);
57      printf("m = %d\n",m);
58
59      return 0;
60 }

函数指针

一、函数指针

      在c语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存的首地址。

我们可以把函数的这个首地址赋予一个指针变量,是该指针变量指向该函数。

然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。(存放函数的首地址的指针变量)

二、函数指针定义方法

       函数指针变量定义的一般形式为:

类型说明符(*指针变量名)(函数的参数);

类型说明符表示返回值类型

"(*指针变量名)"表示“*”后面的变量是定义的指针变量。

最后的空括号是表示指针变量所指的是一个函数。

三、函数指针的初始化

函数的声明:

int sum(int a,int b); ----> 函数指针 int (*p1)(int a,int b);

//定义了一个函数指针 p1

//p1可以存放 返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址

//函数指针的初始化

p1 = sum;  //sum存的就是函数在内存中的首地址。

int  sum(int a,int b){

return a+b;

}

int main(int argc,const char *argv[]){

int x= 3,y =4;

int s = sum(x,y);

//定义函数指针

int (*p)(int a,int b);

//初始化函数指针

p = sum;  //sum函数的首地址

// p  = f1;  不可以的

//注意:定义函数指针的时候,可以不用写形参名

int (*p1)(int ,int );

p1 = sum;

return 0;

}

 1 /*
 2     函数指针的方法
 3     简易计算器
 4 */
 5 #include <stdio.h>
 6
 7 //  简易计算器
 8
 9 int sum(int x,int y){
10
11     return x+y;
12
13 }
14 int jian(int x,int y){
15
16     return x-y;
17
18 }
19 int cheng(int x,int y){
20
21     return x*y;
22
23 }
24 int  chu(int x,int y){
25
26     return x/y;
27
28 }
29
30 int main (int argc , const char * argv[]) {
31
32           //定义一个函数指针
33       int (*p)(int ,int );
34
35       switch(2){
36       case 1:
37                    p = sum;
38            break;
39       case 2:
40                    p = jian;
41            break;
42       case 3:
43                    p = cheng;
44            break;
45       case 4:
46                    p = chu;
47            break;
48
49        }
50         //(*p)(23,45)
51        int s = p(23,45);
52        printf("%d\n",s);
53
54      return 0;
55 }
时间: 2024-10-14 00:12:22

黑马程序员-----指针函数和函数指针的相关文章

黑马程序员——c语言学习心得—— 指针

黑马程序员——c语言学习心得—— 指针 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,打开文件fopen(文件名,打开方式);例如:FILE *fp = fopen("a1","r");  返回的是文件的指针(文件在内存缓冲区的首地址)fopen函数反回值 是指向 a1文件的指针,通常赋值给一个指针变量关于文件名a1 也可以是一个“路径+文件名”   c:\abc.txt----------------

黑马程序员-OC self super isa指针

self指针: self是oc面向对象设计中的一个特殊指针,相当于java中的this,但是比this强大,this只能访问实例对象的相关方法和成员变量,或者说this只代表实例对象: self不仅可以代表实例对象,还可以代表类对象:谁调用当前方法,self就代表谁:如果self用在了以"-"号的方法中,也就是对象方法中,那么就代表实例对象,若果在"+"号开头的方法中,self就代表类对象,因为只有类对象才能调用以"+"号开头的方法: self调

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

黑马程序员—C语言的函数、数组、字符串

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参数名, ... ) {               语句;             return ...         } 3.函数的分类: 根据参数分可以分为  1.有参数函数,2.无参数函           根据返回值分可以分为 1.有返回值函数  2.无返回值函数 4.下面我举一个简单的有

黑马程序员---ios开发之,property指针在ios5中的一些说明

在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似).在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序

黑马程序员--C语言中的指针(3)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 指向多维数组的指针变量 本小节以二维数组为例介绍多维数组的指针变量. 一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11  设数组a的首地址为1000,各下标变量的首地址及其值如图所示.在第四章中介绍过, C语言允许把一个二维数组分解为多个一维数组来处理.因此数组a可分解为三个一维数组,即a[0],a[1],a[2].每一个一维

黑马程序员--C语言中的指针(4)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 使用字符串指针变量与字符数组的区别 用字符数组和字符指针变量都可实现字符串的存储和运算. 但是两者是有区别的.在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘/0’作为串的结束.字符数组是由于若干个数组元素组成的,它可用来存放整个字符串. 2. 对字符数组作初始化赋值,必须采用外部类型或静态

黑马程序员--C语言中的指针(5)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 指针型函数 前面我们介绍过,所谓函数类型是指函数返回值的类型. 在C语言中允许一个函数的返回值是一个指针(即地址), 这种返回指针值的函数称为指针型函数. 定义指针型函数的一般形式为: 类型说明符 *函数名(形参表) { …… /*函数体*/ } 其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针.类型说明符表示了返回的指针值所指向的数据类型. 如: int *ap(int 

黑马程序员--C语言中的指针(6)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 本章小结 1. 指针是C语言中一个重要的组成部分,使用指针编程有以下优点: (1)提高程序的编译效率和执行速度. (2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯. (3)可以实现动态的存储分配. (4)便于表示各种数据结构,编写高质量的程序. 2. 指针的运算 (1)取地址运算符&:求变量的地址 (2)取内容运算符*:表示指针所指的变量 (3)赋值运算 ·把

黑马程序员--C语言中的指针-我之笔记

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- -------------------------------指针--------------------------------- 指针? 内存单元的编号也叫做地址.既然根据内存单元的 号或地址就可以找到所需的内存单元,所以通常也把这个