zoukankan      html  css  js  c++  java
  • 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;

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

      

  • 相关阅读:
    【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
    【题解】【BT】【Leetcode】Binary Tree Level Order Traversal
    【题解】【BST】【Leetcode】Unique Binary Search Trees
    【题解】【矩阵】【回溯】【Leetcode】Rotate Image
    【题解】【排列组合】【素数】【Leetcode】Unique Paths
    【题解】【矩阵】【回溯】【Leetcode】Unique Paths II
    【题解】【BST】【Leetcode】Validate Binary Search Tree
    【题解】【BST】【Leetcode】Convert Sorted Array to Binary Search Tree
    第 10 章 判断用户是否登录
    第 8 章 动态管理资源结合自定义登录页面
  • 原文地址:https://www.cnblogs.com/greatfish/p/5979224.html
Copyright © 2011-2022 走看看