学习记录——day12(c语言衔接数据结构)指针

函数指针数组

1、当想要存储多个函数入口地址时,需要定义多个函数指针变量来存储

2、数组就是一次性定义多个变量的操作

3、想要存储多个函数指针变量,就可以调用一个函数指针数组来完成,对函数的鼻梁处理

4、定义格式:数据类型 (*数组名p[数组长度])(形参列表)

#include <stdio.h>
int he(int m,int n)
{
    return m+n;
}

int cha(int m,int n)
{
    return m-n;
}

int ji(int m,int n)
{
    return m*n;
}
    

int main()
{
    int (*jishuan[3])(int,int)={he,cha,ji};

    for (int  i = 0; i < 3; i++)
    {
        printf("结果为:%d\n",jishuan[i](5,9));
    }
    return 0;
}

二级指针

1、指针变量也是在内存中占相应的存储空间的,共占8字节的空间

2、既然有地址空间,就有起始地址,该地址也是一个比较难记忆的数字,于是定义一个指针变量来存储

3、存储指针变量的指针变量,称为二级指针变量

4、定义格式:数组类型 **指针名

5、二级指针的应用:

        指针变量           指向的一级指针中的地址

        *指针变量          一级指针变量中的值    

        **指针变量         一级指针变量所指向的内存空间的值

#include <stdio.h>
int main()
{
    int num = 520;
    int *ptr = &num;
    int **qtr = &ptr;

    printf("num = %d\n",num);
    printf("*ptr = %d\n",*ptr);
    printf("**qtr = %d\n",**qtr);

    //qtr = &(&num)  不可行  c语言中运算e结果是右值,是临时值,无内存

    return 0;
}

 qtr+1 偏移了 8 ,它说明是int * 类型的(偏移量由数据类型决定)

#include<myhead.h>

int main(int argc, const char *argv[])
{
    int num = 520;          //定义一个普通变量
    int *ptr = &num;         //将普通变量的地址赋值给指针变量
    int * *qtr = &ptr;        //将指针变量的地址赋值给二级指针变量

    printf("num = %d\n", num);         //通过普通变量访问值
    printf("*ptr = %d\n", *ptr);       //通过一级指针变量访问值
    printf("**qtr = %d\n", **qtr);     //通过二级指针变量访问值

    //qtr = &(&num);          //该语句是错误的,C语言中所有表达式的结果都是一个右值

    int arr[3][3] = {1,2,3,4,5,6,7,8,9};      //定义二维数组
    //arr <==> &arr[0]  ==> &&arr[0][0]
    qtr = arr;                  //?
    printf("sizeof(qtr) = %ld\n", sizeof(qtr));   //8
    printf("sizeof(arr) = %ld\n", sizeof(arr));   //36

    printf("qtr = %p, arr = %p\n", qtr, arr);      //一样
    printf("qtr+1 = %p, arr+1 = %p\n", qtr+1, arr+1);      //一样
    //printf("*qtr = %p\n", *qtr);
    当二级指针执行二维数组时,不能直接访问元素
    //printf("%d\n", qtr[0][0]);     //不可以访问
    return 0;
}

 二级指针的一般使用

#include <stdio.h>
int erji_zz(int **ptr)
{
    static int key = 2024;
    *ptr = &key;

}

int main()
{
    int a = 2010;

    int *qtr = &a;

    erji_zz(&qtr);

    printf("*qtr = %d\n",*qtr);

    return 0;
}

 

万能指针

1、万能指针可以接收任何变量的地址

2、定义格式: void *指针名

3、注意:万能指针变量只能接收给定空间的起始地址,并没有实际类型的限制

4、万能指针变量不能直接进行取值运算,只能转变为集体的指针变量进行取值

基础用法

 常用

#include<myhead.h>

int main(int argc, const char *argv[])
{
    int num = 0x12345678;
    char key;

    //定义万能指针变量
    void *ptr = &num;
    printf("&num = %p, ptr = %p\n", &num, ptr);
    //printf("*ptr = %d\n", *ptr);     //不能直接操作
    
    key = *(char *)ptr;         //将万能指针转变成具体的指针使用
    printf("key = %#x\n", key);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值