• c语言指针笔记


    一.int a[20]
    1. 数组名代表数组首元素的地址,不代表数组的地址
    2. 对数组名取地址代表整个数组的地址.
    a和&a代表的数据类型不一样 a代表数组首元素的地址 &a数组类型 int[20]类型

    数组的类型由元素的类型和数组大小共同决定 如:int array[5] 的类型为int[5]

    数组类型:
    typedef int(MYINT5)[5]; MYINT5为长度为5的数组类型
    typedef float[MYFLOAT10][10] MYFLOAT10 为长度为10的浮点数组类型

    数组定义:
    MYINT5 iArray;
    MYFLOAT10 fArray;

    二. 数组指针
    1. 使用数组类型来定义数组指针:
    typedef int(MYINT5)[5]; // MYINT5为长度为5的数组类型
    MYINT5 * pArray;//定义一个指向数组类型的指针变量
    int e[5]={1,2,3,4,5};
    pArray = &e;//对数组指针赋值,需要对数组名取地址
    2. 直接定义一个数组指针
    int (*p)[5] //定义一个指向5个整形类型的数组指针
    int a[5] = {0};
    p = &a;

    //用数组指针去遍历数组
    for(int i = 0; i<4;i++)
    {
    (*pArray)[i] = i;
    }

    三. 二维数组解析

    int a[5][6];
    数组名代表数组首元素的地址 所以a是一个数组指针,它的步长为6, 相当于 int(*p)[6]

    四. 函数指针作为函数参数的三种模型
    模型一:二维数组作为函数参数
    因为数组在传递给函数作为函数参数的时候会出现退化的情况,会退化为指针,
    所以二维数组在传参的过程中也会变成指针,例如:把二维数组 char a[5][100]要作为
    参数传递给一个函数,那么函数的声明可以用下列方式声明:
    void f(char a[5][100]);
    void f(char a[][100]);//因为数组会退化成指针,所以第一个方括号中的长度没有也可以
    void f(char (*a)[100]);//在第二个的基础上,编译器会把数组转化为指针,而这个指针应该能正确反映出a+1代表的步长,所以应该参数声明为数组指针,而不能是二级指针char **p;因为二级指针进行*操作,例如(*p)+1那么步长是4,因为
    进行*p操作,(*p)是 char *类型,char * 类型的长度是4,而数组的步长在这里是100,所以会出现错误

    模型二:指针数组作为函数参数
    指针数组其实是一个数组,数组的成员指针类型: 例如: char *p[100];
    因为是数组,所以在传递给函数参数的时候,会退化成指针,所以函数可以这样声明:
    void f(char * p[100]);
    void f(char *p[]);//数组会退化成指针,所以有没有数组长度都无所谓
    void f(char **p);在第二步的基础上,继续退化成指针类型,就变成了二级指针.

    模型三:程序员手动使用malloc函数分配内存
    首先分配一个数组,数组的成员是指针类型,每个成员分别指向一个一维数组,例如:
    char **myarray = (char **)malloc(10*sizeof(char*)); //int array[10] 
    if (myarray == NULL)
    {
    return;
    }
    for (i=0; i<10; i++)
    {
    myarray[i] = (char *)malloc(100*sizeof(char)); //char buf[100];
    if (myarray[i] == NULL)
    {
    printf("ddddde ");
    return;
    }
    sprintf(myarray[i],"%d%d%d ", i, i, i);
    }
    这种模型和模型二基本一样,只不过是程序员手动分配的内存空间,所以在使用完后要及时释放指针,防止memory leak;

    综上所述:
    二维数组作为函数参数应该使用数组指针来声明函数参数
    指针数组作为函数参数应该使用二级指针来声明函数参数

      

  • 相关阅读:
    SpringBoot整合RabbitMQ
    NIO
    eclipse配置maven
    IDEA常用快捷键
    IDEA如何快速查看类中的属性和方法?
    Java之IO流
    JS判断对象是否包含某个属性
    Jquery获取链接请求的参数
    JS中indexOf的用法
    JS驼峰与下划线互转
  • 原文地址:https://www.cnblogs.com/greatfish/p/5979224.html
Copyright © 2020-2023  润新知