這個問題我糾結了蠻久了,因為需要學習的東西太多,所以沒有能好好研究這個。希望這篇文章能夠幫助你們。

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\t", (map[i] + j)->F); 27 } 28 printf("\n"); 29 } 30 return 0; 31 }
示例一思想:1、分配結構體指針空間;
2、為指針指的地方分配相應節點數空間。

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\t", (map[i] + j)->F); 25 } 26 printf("\n"); 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。

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\t", (map[i] + j)->F); 27 } 28 printf("\n"); 29 } 30 free(map); 31 return 0; 32 }
這里是直接分配一大塊空間,然后再用指針來分割的。只要理解前面兩個了,這里並不難。
關於二維數組作為函數參數的用法可參見:http://www.cnblogs.com/Anker/archive/2013/03/09/2951878.html
作者:名不見
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.