指針做參數的動態內存分配與二重指針(下)
阿新 • • 發佈:2017-11-01
-1 oid eof 元素 num inter alloc 內存分配 定義
要實現指針作為函數形參,改變實參指針的值。一般有兩種做法:
- 使用雙指針,或者指針數組形式作為形參,將實參的地址傳入函數,也即要給形參傳入指針的地址!
http://blog.csdn.net/liuyajun2013/article/details/17151309#0-tsina-1-79483-397232819ff9a47a7b7e80a40613cfe
http://www.cnblogs.com/heat-man/p/4646051.html
http://www.jb51.net/article/37516.htm
- 利用返回指針的函數直接返回分配好內存的地址(動態(堆)內存分配你懂的)
接上篇:為一個m行n列的二維數組開辟空間輸入各元素的值,再然後輸出。
方法一:直接分配一塊連續的空間存放m * n個元素:
#include <stdio.h> #include <stdlib.h> #include <memory.h> int main() { void Input(int *pointer_1, int *pointer_2); //輸入行列 int *allocation(int dimention); //分配內存 void Output(int *pointer, int line, int column); //輸出各元素值int m, n; int *pointer_counterpart; Input(&m, &n); pointer_counterpart = allocation(m * n); Output(pointer_counterpart, m, n); free(pointer_counterpart); return 0; } void Input(int *pointer_1, int *pointer_2) { printf ("Please input the line & column:\n"); scanf ("%d%d", pointer_1, pointer_2); } int *allocation(int dimention) { int *pointer; printf ("Please input %d numbers:\n", dimention); pointer = (int*)malloc(dimention * sizeof(int)); //分配了一塊連續的空間 memset(pointer, 0, dimention); for (int i = 0; i < dimention; ++i) { scanf ("%d", pointer + i); } return pointer; } void Output(int *pointer, int line, int column) { int *pointer_copy; pointer_copy = pointer; printf ("The matrix is:\n"); for (int i = 0; i < line; ++i) { for (int j = 0; j < column; ++j) { printf ("%d ", *pointer_copy++); //這種表達方式很好 } printf ("\n"); } pointer_copy = pointer; }
方法二:連續分配m塊連續的空間各存放 n個元素:
#include <stdio.h> #include <stdlib.h> int **pointer_counterpart; //要定義此全局變量 int main() { void Input(int *pointer_1, int *pointer_2); void allocation(int line, int column); void display(int **pointer, int line, int column); void free_pointer(int **pointer, int line); int m, n; //int *pointer_counterpart[line]; Input(&m, &n); allocation(m, n); display(pointer_counterpart, m, n); free_pointer(pointer_counterpart, m); //pointer_counterpart = return 0; } void Input(int *pointer_1, int *pointer_2) { printf ("Please input the line & column:\n"); scanf ("%d%d", pointer_1, pointer_2); } void allocation(int line, int column) { //int **pointer; ///二重指針多與指針數組一同使用 int *pointer_array[line]; for (int i = 0; i < line; ++i) { pointer_array[i] = (int*)malloc(column * sizeof(int)); } printf ("Please input %d *%d numbers:", line, column); for (int i = 0; i < line; ++i) { for (int j = 0; j < column; ++j) { scanf ("%d", pointer_array[i] + j); } } //pointer = pointer_array; pointer_counterpart = pointer_array; ///全局變量指針指向了指針數組的首地址 } void display(int **pointer, int line, int column) { printf ("The matrix is:\n"); for (int i = 0; i < line; ++i) { for (int j = 0; j < column; ++j) { printf ("%d ", *(pointer[i] + j)); } printf ("\n"); } } void free_pointer(int **pointer, int line) { for (int i = 0; i < line; ++i) { free(pointer[i]); } }
指針做參數的動態內存分配與二重指針(下)