zoukankan      html  css  js  c++  java
  • 哥终于征服了c的多维数组指针

    一个小例子,把一个字符串按逗号分隔,放到一个字符串数组里,字符串在C里也是用字符数组表示的,所以就要声明一个两位数组。

    声明指针变量有几种情况,

    1. 指向单个值,如int,用int *p;
    2. 指向数组,如一个元素类型为int,长度为3的数组,用 int (*p)[3];

    我们所要的数组是4个字符串,每个字符串是3个长度(加上'\0'),所以我们先声明一个指向元素为char,长度为3的数组指针char (pc*)[3];

    然后分配空间的时候我们分配4块儿这么长的空间,即malloc(4*3*sizeof(char));

    都初始化为'\0',memset(pc,'\0',4*3*sizeof(char));

    剩下的就是访问第一个字符数组的时候用*pc,也就是pc[0],访问第二个字符数组用*pc++,也就是pc[1],刚不是说pc是个指针吗,怎么还可以用下标访问,这不就成了数组了吗?经我观察,确实差不多,以下两段代码是一回事(不考虑内存分配细节),得到的pc变量使用起来一模一样。

    第一段:c是栈上分配的二维数组,pc是一个指向它的数组指针,热了,一个是数组指针,一个是二维数组,竟然能指过去,看来C不是强类型语言,内存里存的啥都不管,直接用一个带类型的指针去指,指成啥是啥,汗了。

    char c[4][3] = {{'\0'}};
    char (*pc)[3] = c;
    第二段:我目前使用的这种的方式,直接在堆上申请内存,然后强转成一个数组指针,其实我也也没办法,不知道咋强转成char[4][3]这样的二维数组。

    char (*pc)[n] = (char(*)[n])malloc(m*n*sizeof(char));
    memset(pc,
    '\0',m*n*sizeof(char));

    以下是完整的代码,cygwin+gcc 3.4.4编译通过

    代码
    #include <stdio.h>
    #include
    <string.h>

    int main()
    {
    int i = 0, m = 4, n = 3;
    char *input = "a1,b2,c3,d4";

    char (*pc)[n] = (char(*)[n])malloc(m*n*sizeof(char));
    memset(pc,
    '\0',m*n*sizeof(char));
    char (*pc1)[n] = pc;

    char *p1 = strtok(input, ",");
    while(p1 != NULL)
    {
    strncpy(
    *pc++, p1, 2);
    p1
    = strtok(NULL, ",");
    }
    pc
    = pc1;
    for(i = 0; i < m; i++)
    {
    printf(
    "xxx%d=%s\n",i,*pc++);
    }
    free(pc1);
    return 0;
    }

  • 相关阅读:
    JSON的数据格式
    KMP 算法
    爬虫原理
    快速求小于N的所有素数
    对程序员最具影响的书籍
    实现下拉更新UITableView EGORefreshTableHeaderView
    温习C/C++笔记——浅谈琐碎知识点(1)
    C++内存对齐
    SQL Server 安装程序无法获取 ASPNET 帐户的系统帐户信息
    Asp.Net生命周期事件
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/1830066.html
Copyright © 2011-2022 走看看