C的日记-指针续

【函数指针】

<1>什么是函数指针
    int a,b,c;
    int max(int,int);
    int (*p)(int,int);    //定义指针函数,指针变量活取函数地址
    p=max;
    c=(*p)(a,b)
    函数指针就是函数的起始地址,我们可以使用一个指向函数的指针变量来存储这个地址,当前的指针变量就指向这个函数。
    在第二行声明一个函数,第三行声明一个指向int类型的指针变量,而且这个指针变量后面[有对圆括号],这个就是指向函数的指针变量,我们想下,如果是int *p(int,int)会是怎样?由于(的优先级高,所以就是先声明了一个p(int,int)函数,这个函数返回的是指向整型变量的指针。
    第三句只是定义了一个指向函数的指针变量,并没有说明是什么函数,到了第四局把max函数首地址赋给指针变量才算是指定了函数。但此刻函数并没有运行,直到第5句利用函数指针变量调用函数的时候才执行了相应的内容。
<2>函数指针作函数参数
   在Main函数中把函数入口地址传递给处理函数的形参(函数指针变量),把函数要处理的数据传递给对应的形参,在处理函数是根据要处理的函数地址(函数指针变量)和接收到的数据进行输出。粗浅的理解为低耦合。

    #include <stdio.h>
    void main(){
        int max(int,int);
        int min(int,int);
        int add(int,int);
        void fun(int x,int y,int(*p)(int,int));
        int a=2,b=3,c;
        printf("输入1/2/3\n");
        scanf("%d",&c);
        if(c==1){
            fun(a,b,max);
        }
        else if(c==2){
            fun(a,b,min);
        }
        else if(c==3){
            fun(a,b,add);
        }
    }
    void fun(int x,int y,int(*p)(int,int)){
        int result;
        result=(*p)(x,y);
        printf("%d\n",result);
    }
    int max(int x,int y){
        int z;
        if(x>y)z=x;
        else z=y;
        printf("Max is");
        return z;
    }
    int min(int x,int y){
        int z;
        if(x>y)z=y;
        else z=x;
        printf("Min is");
        return z;
    }
    int add(int x,int y){
        int z;
        z=x+y;
        printf("Sum is");
        return z;
    }

【返回指针的函数】
如:int *a(int x,int y);        //定义函数a,返回一个指向整形数据的指针
【指针数组】
如:int *a[5];    //定义指针数组,数组中的每一个元素都是指针变量
    由于[]的优先级比较高,先计算a[5]说明它是数组形式,前面加上×表示它是指针数组。
    注:int *a[5]和int (*a)[5]的区别
        后面这中形式表示指向一维数组(这个数组最大编号为5)的指针变量。
指针数组的应用:大多用来指向若干个字符串,如:
    char *name[]={"Fello me","Basic","Frotran","Computer class"};
    其中数组中存放的是各个字符串的首字符的地址,这么做的好处是节省空间,而且指针可以改变。如果用二维数组存储这些字符串,那么第一点数组的长度必须超过最长字符串的长度,这就造成了空间浪费;第二,数组移动字符串要比改变指针变量地址麻烦的多。

【指向指针数据的指针】
如:char **p; char c=‘a‘;
    *p=&c;    //
在定义时,char **P是二级指针,而在使用的时候,**p是指二级指针,存放的是一级指针变量的地址,*p是一级指针,存放的是变量的地址,p是‘a‘即变量的值;

时间: 2024-10-04 09:14:55

C的日记-指针续的相关文章

黑马程序员-C学习日记-指针

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.指针 1.内存中最小的单元是字节,每一个字节都有编号,这编号就是指针. 指针:内存地址 有了指针就有了打开这块内存的钥匙,就可以操作这一块内存 2.指针变量:存放内存地址的变量. 3.定义指针:指针所指向数据类型  *指针变量名称  代码演示: #include <stdio.h> int main(int argc ,const char *argv[]{ int num = 10; i

Hadoop日记系列目录

下面是Hadoop日记系列的目录,由于目前时间不是很充裕,以后的更新的速度会变慢,会按照一星期发布一期的原则进行,希望能和大家相互学习.交流. 目录安排 1>  Hadoop日记Day1---Hadoop介绍 2>  Hadoop日记Day2---虚拟机中搭建Linux 3>  Hadoop日记Day3---Hadoop的伪分布式安装 4>  Hadoop日记Day4---去除HADOOP_HOME is deprecated 5>  Hadoop日记Day5---HDFS介

StdC--11 指针基本知识(2)

Hightlight 1. Review & summary 2. 指针数组&数组指针(指向数组的指针) 3.数组和字符串 4. 函数指针(指向函数的指针) 5. 堆分配内存 malloc函数 6. 堆分配内存其他相关函数: 6.1 calloc 函数 6.2 realloc 函数   1. Review & summary 1.1 指针作为形参 指针做为函数的形参 得到的是变量的地址 通过地址访问可以访问到原始变量 所以有机会修改到原始数据 (方法就是:对指针加*号 去操作数据)

C语言指针学习(续)

五.数组和指针的关系 int array[10] = {0,1,2,3,4,5,6,7,8,9},value; ... ... value = array[0];//也可以写成 value = *array; value = array[3];//也可以写成 value = *(array+3); value = array[4];//也可以写成 value = *(array+4); 上例中,一般而言,数组名array代表数组本身,类型是int[10];如果把array看作指针的话,它指向数组

善于指针---使用返回指针值的函数(续)

综合举个例子来说明一下,使用返回指针值的函数,也可以理解为利用指针传递内存. 在返回指针时,除可以返回动态内存外,还可以返回静态存储区.但是不能利用指针传递桟内存,因为桟内存函数结束时也消失了,返回的会是一些垃圾内容,无效. 基础内容见:善于指针---使用返回指针值的函数 //在返回指针时,除可以返回动态内存外,还可以返回静态存储区 #include<iostream> #include<string> using namespace std; //利用指针传值 char *Tes

续写上一篇的数组or指针操作

C语言,同样适用if else while 这样的语法,但不同的人,就是有不同的实现方式,甚至是技巧. eg: 1 #include <stdio.h> 2 #include<string.h> 3 typedef _Bool bool; 4 #define true 1 5 #define false 0 6 #define N 10 7 bool identity_matrix(int matrix[][N]) 8 { 9 int row, column; 10 for (ro

函数重载(续)==》函数重载和函数指针在一起

函数重载与函数指针(这一块很重要,后续要继续学习): 当使用重载函数名对函数指针赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 #include <iostream> using namespace std; void myFunc(int a) {     printf("a:%d\n",a); } void myFunc(char *p) {     printf("p:%s\n",p); } v

C的日记-数组和指针

[数组] C语言中数组名表示该数组的起始地址,即给数组本身对应的值就是一个地址,而数组中的值就是从起始地址开始的不同的地址内的值. 如:char c[9];        //定义时的数组char c[5]中的c和运算时的c是一个含义,都是数组首地址     scanf("%s",c);     printf("%d",c); // printf(%s,c) 输入:china 输出:2686675.输出的是字符数组首地址. 若换为后面一个,输出china,输出chi

C++ Primer 学习笔记_102_特殊工具与技术 --运行时类型识别[续]

特殊工具与技术 --运行时类型识别[续] 三.RTTI的使用 当比较两个派生类对象的时候,我们希望比较可能特定于派生类的数据成员.如果形参是基类引用,就只能比较基类中出现的成员,我们不能访问在派生类中但不在基类中出现的成员. 因此我们可以使用RTTI,在试图比较不同类型的对象时返回假(false). 我们将定义单个相等操作符.每个类定义一个虚函数 equal,该函数首先将操作数强制转换为正确的类型.如果转换成功,就进行真正的比较:如果转换失败,equal 操作就返回 false. 1.类层次 c