这个问题我纠结了蛮久了,因为需要学习的东西太多,所以没有能好好研究这个。希望这篇文章能够帮助你们。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stddef.h> 4 5 typedef struct LNode { 6 int F; 7 struct LNode* next; 8 }LNode, *LinkList; 9 int main() 10 { 11 LNode** map = (LNode **)malloc(5 * sizeof(LNode*) ); //分配5个结构体指针空间 12 for (int i = 0; i < 5; ++i) //这里循环对5个指针分配相应的空间 13 { 14 map[i] = (LNode *)malloc(10*sizeof(LNode)); //分配10个节点空间 15 } 16 17 for (int i = 0; i < 5; ++i) 18 for (int j = 0; j < 10; ++j) 19 { 20 (map[i] + j)->F = j; 21 } 22 for (int i = 0; i < 5; ++i) 23 { 24 for (int j = 0; j < 10; ++j) 25 { 26 printf("%d ", (map[i] + j)->F); 27 } 28 printf(" "); 29 } 30 return 0; 31 }
示例一思想:1、分配结构体指针空间;
2、为指针指的地方分配相应节点数空间。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stddef.h> 4 5 typedef struct LNode{ 6 int F; 7 struct Lnode* next; 8 }LNode,*pLNode; 9 int main() 10 { 11 LNode** map = (LNode **)malloc(5*sizeof(LNode*)); 12 LNode *tMap = (LNode *)malloc(5 * 10 * sizeof(LNode)); 13 for (int i = 0; i < 5; ++i) 14 { 15 map[i] = (LNode *)((char *)tMap + i * 10 * sizeof(LNode)); 16 } 17 for (int i = 0; i < 5; ++i) 18 for (int j = 0; j < 10; ++j) 19 (map[i] + j)->F = j; 20 for (int i = 0; i < 5; ++i) 21 { 22 for (int j = 0; j < 10; ++j) 23 { 24 printf("%d ", (map[i] + j)->F); 25 } 26 printf(" "); 27 } 28 free(tMap); 29 free(map); 30 return 0; 31 }
示例二思想:1、分配结构体指针空间;
2、分配相应节点数的空间;
3、用指针数组来分割。
注:我刚开始写的是“map[i] = tMap + i * 10 * sizeof(LNode);”这么一句,由于这里tMap是LNode结构体指针,所以他移动为【i * 10 * sizeof(LNode)】*sizeof(LNode)。举个例子int *a; 那么a +3; 就是 "a指向的地址" + 3*sizeof(int)。所以,如果非要这样这样相加的话可以把tMap转换为char*类型的地址在相加,最后再强制类型转换,即如代码中所示map[i] = (LNode *)((char *)tMap + i * 10 * sizeof(LNode))。当然亦可如map[i] =tMap + i * 10。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stddef.h> 4 5 typedef struct LNode{ 6 int F; 7 struct Lnode* next; 8 }LNode,*pLNode; 9 int main() 10 { 11 LNode** map = (LNode **)malloc(5*sizeof(LNode*) + 5 * 10 * sizeof(LNode)); 12 LNode *head = (LNode *)(map + 5); //这里等价于map所指的地址加上5*sizeof(LNode*) 13 for (int i = 0; i < 5; ++i) 14 { 15 map[i] = head + i * 10; 16 //这里原理类似,一定要理解int *a; 那么a + 3所指的地址就是"a指向的地址" + 3*sizeof(int)。 17 18 } 19 for (int i = 0; i < 5; ++i) 20 for (int j = 0; j < 10; ++j) 21 (map[i] + j)->F = j; 22 for (int i = 0; i < 5; ++i) 23 { 24 for (int j = 0; j < 10; ++j) 25 { 26 printf("%d ", (map[i] + j)->F); 27 } 28 printf(" "); 29 } 30 free(map); 31 return 0; 32 }
这里是直接分配一大块空间,然后再用指针来分割的。只要理解前面两个了,这里并不难。
关于二维数组作为函数参数的用法可参见:http://www.cnblogs.com/Anker/archive/2013/03/09/2951878.html
作者:名不见
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.