zoukankan      html  css  js  c++  java
  • 多维数组和多维指针

    指向指针的指针

    • 指针的本质是变量
    • 指针会占用一定的内存空间
    • 可以定义指针的指针来保存指针变量的地址值
    int main()
    {
    	int i = 0;
    	int* p = NULL;
    	int** pp = NULL;
    	pp = &p;
    	*pp = &i;
    	return 0;
    }
    

    问题

    为什么需要指向指针的指针

    • 指针在本质上也是变量
    • 对于指针也同样存在传值调用和传址调用

    例子1:重置动态空间大小

    #include <stdio.h>  
    #include <malloc.h>  
      
    int reset(char**p, int size, int new_size)  
    {  
        int ret = 1;  
        int i = 0;  
        int len = 0;  
        char* pt = NULL;  
        char* tmp = NULL;  
        char* pp = *p;  
          
        if( (p != NULL) && (new_size > 0) )  
        {  
            pt = (char*)malloc(new_size);  
              
            tmp = pt;  
              
            len = (size < new_size) ? size : new_size;  
              
            for(i=0; i<len; i++)  
            {  
                *tmp++ = *pp++;        
            }  
              
            free(*p);  
            *p = pt;  
        }  
        else  
        {  
            ret = 0;  
        }  
          
        return ret;  
    }  
      
    int main()  
    {  
        char* p = (char*)malloc(5);  
          
        printf("%p
    ", p);  
          
        if( reset(&p, 5, 3) )       //传址调用
        {  
            printf("%p
    ", p);  
        }  
      
        free(p);  
          
        return 0;  
    }  
    

    二维数组与二级指针

    • 二维数组在内存中以一维的方式排布
    • 二维数组中的第一维是一维数组
    • 二维数组的第二维才是具体的值
    • 二维数组的数组名可以看做常量指针

    例子2:遍历二维数组

    #include <stdio.h>  
    #include <malloc.h>  
      
    void printArray(int a[], int size)  
    {  
        int i = 0;  
          
        printf("printArray: %d
    ", sizeof(a));  
      
        for(i=0; i<size; i++)  
        {  
            printf("%d
    ", a[i]);  
        }  
    }  
      
    int main()  
    {  
        int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};  
        int* p = &a[0][0];  
          
        int i = 0;  
        int j = 0;  
          
        for(i=0; i<3; i++)  
        {  
            for(j=0; j<3; j++)  
            {  
                printf("%d, ", *(*(a+i) + j));  
            }  
              
            printf("
    ");  
        }  
          
        printf("
    ");  
          
        printArray(p, 9);  
          
        return 0;  
    }  
    

    数组名

    • 一维数组名代表数组首元素的地址
      • int a[5] a的类型为int*
    • 二维数组名同样代表数组首元素的地址
      • int m[2][3] m的类型为int(*)[5]

    结论:

    • 二维数组名可以看做是指向数组的常量指针
    • 二维数组可以看做是一维数组
    • 二维数组中的列个元素都是同类型的一维数组

    例子3:动态申请二维数组

    #include <stdio.h>  
    #include <malloc.h>  
      
    int** malloc2d(int row, int col)  
    {  
        int** ret = NULL;  
          
        if( (row > 0) && (col > 0) )  
        {  
            int* p = NULL;  
              
            ret = (int**)malloc(row * sizeof(int*));  
            p = (int*)malloc(row * col * sizeof(int));  
              
            if( (ret != NULL) && (p != NULL) )  
            {  
                int i = 0;  
                  
                for(i=0; i<row; i++)  
                {  
                    ret[i] = p + i * col;  
                }  
            }  
            else  
            {  
                free(ret);  
                free(p);  
                  
                ret = NULL;  
            }  
              
        }  
          
        return ret;  
    }  
      
    void free2d(int** p)  
    {  
        if( *p != NULL )  
        {  
            free(*p);  
        }  
          
        free(p);  
    }  
      
    int main()  
    {  
        int** a = malloc2d(3, 3);  
        int i = 0;  
        int j = 0;  
          
        for(i=0; i<3; i++)  
        {  
            for(j=0; j<3; j++)  
            {  
                printf("%d, ", a[i][j]);  
            }  
              
            printf("
    ");  
        }  
          
        free2d(a);  
          
        return 0;  
    }  
    

    小结

    • C语言中只支持一维数组
    • C语言中的数组大小必须在编译期就作为常数确定
    • C语言中的数组元素可以是任何类型的数据
    • C语言中的数组的元素可以是另一个数组
  • 相关阅读:
    Session的使用与Session的生命周期
    Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用
    十九、详述 IntelliJ IDEA 之 添加 jar 包
    十八、IntelliJ IDEA 常用快捷键 之 Windows 版
    十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
    十六、详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法
    十五、详述 IntelliJ IDEA 插件的安装及使用方法
    十四、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
    十三、IntelliJ IDEA 中的版本控制介绍(下)
    十二、IntelliJ IDEA 中的版本控制介绍(中)
  • 原文地址:https://www.cnblogs.com/yanyun888/p/9213210.html
Copyright © 2011-2022 走看看