一个小例子,把一个字符串按逗号分隔,放到一个字符串数组里,字符串在C里也是用字符数组表示的,所以就要声明一个两位数组。
声明指针变量有几种情况,
- 指向单个值,如int,用int *p;
- 指向数组,如一个元素类型为int,长度为3的数组,用 int (*p)[3];
我们所要的数组是4个字符串,每个字符串是3个长度(加上' '),所以我们先声明一个指向元素为char,长度为3的数组指针char (pc*)[3];
然后分配空间的时候我们分配4块儿这么长的空间,即malloc(43sizeof(char));
都初始化为' ',memset(pc,' ',43sizeof(char));
剩下的就是访问第一个字符数组的时候用pc,也就是pc[0],访问第二个字符数组用pc++,也就是pc[1],刚不是说pc是个指针吗,怎么还可以用下标访问,这不就成了数组了吗?经我观察,确实差不多,以下两段代码是一回事(不考虑内存分配细节),得到的pc变量使用起来一模一样。
第一段:c是栈上分配的二维数组,pc是一个指向它的数组指针,热了,一个是数组指针,一个是二维数组,竟然能指过去,看来C不是强类型语言,内存里存的啥都不管,直接用一个带类型的指针去指,指成啥是啥,汗了。
char c[4][3] = {{' '}};char (*pc)[3] = c;
第二段:我目前使用的这种的方式,直接在堆上申请内存,然后强转成一个数组指针,其实我也也没办法,不知道咋强转成char[4][3]这样的二维数组。
char (*pc)[n] = (char(*)[n])malloc(m*n*sizeof(char));memset(pc,' ',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,' ',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=%sn",i,*pc++); } free(pc1); return 0; }
原文链接: https://www.cnblogs.com/onlytiancai/archive/2010/09/18/1830066.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/15141
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!