指向指针的指针:
问题:
重置动态空间大小示例:
1 #include <stdio.h> 2 #include <malloc.h> 3 4 int reset(char**p, int size, int new_size) 5 { 6 int ret = 1; 7 int i = 0; 8 int len = 0; 9 char* pt = NULL; 10 char* tmp = NULL; 11 char* pp = *p; 12 13 if( (p != NULL) && (new_size > 0) ) 14 { 15 pt = (char*)malloc(new_size); 16 17 tmp = pt; 18 19 len = (size < new_size) ? size : new_size; 20 21 for(i=0; i<len; i++) 22 { 23 *tmp++ = *pp++; 24 } 25 26 free(*p); 27 *p = pt; 28 } 29 else 30 { 31 ret = 0; 32 } 33 34 return ret; 35 } 36 37 int main() 38 { 39 char* p = (char*)malloc(5); 40 41 printf("%p ", p); 42 43 if( reset(&p, 5, 3) ) 44 { 45 printf("%p ", p); 46 } 47 48 free(p); 49 50 return 0; 51 }
运行结果如下:
二维数组与二维指针:
遍历二维数组:
1 #include <stdio.h> 2 #include <malloc.h> 3 4 void printArray(int a[], int size) 5 { 6 int i = 0; 7 8 printf("printArray: %d ", sizeof(a)); 9 10 for(i=0; i<size; i++) 11 { 12 printf("%d ", a[i]); 13 } 14 } 15 16 int main() 17 { 18 int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; 19 int* p = &a[0][0]; 20 21 int i = 0; 22 int j = 0; 23 24 for(i=0; i<3; i++) 25 { 26 for(j=0; j<3; j++) 27 { 28 printf("%d, ", *(*(a+i) + j)); 29 } 30 31 printf(" "); 32 } 33 34 printf(" "); 35 36 printArray(p, 9); 37 38 return 0; 39 }
第28行的等价代换如下:
10-13行的程序是线性的访问一段内存的值。
运行结果如下:
二位数组在内存中是按一维的方式排列的。
数组名:
动态申请二维数组:
1 #include <stdio.h> 2 #include <malloc.h> 3 4 int** malloc2d(int row, int col) 5 { 6 int** ret = NULL; 7 8 if( (row > 0) && (col > 0) ) 9 { 10 int* p = NULL; 11 12 ret = (int**)malloc(row * sizeof(int*)); 13 p = (int*)malloc(row * col * sizeof(int)); 14 15 if( (ret != NULL) && (p != NULL) ) 16 { 17 int i = 0; 18 19 for(i=0; i<row; i++) 20 { 21 ret[i] = p + i * col; 22 } 23 } 24 else 25 { 26 free(ret); 27 free(p); 28 29 ret = NULL; 30 } 31 32 } 33 34 return ret; 35 } 36 37 void free2d(int** p) 38 { 39 if( *p != NULL ) 40 { 41 free(*p); 42 } 43 44 free(p); 45 } 46 47 int main() 48 { 49 int** a = malloc2d(3, 3); 50 int i = 0; 51 int j = 0; 52 53 for(i=0; i<3; i++) 54 { 55 for(j=0; j<3; j++) 56 { 57 printf("%d, ", a[i][j]); 58 } 59 60 printf(" "); 61 } 62 63 free2d(a); 64 65 return 0; 66 }
运行结果如下:
小结: