1. 程式人生 > >指針做參數的動態內存分配與二重指針(下)

指針做參數的動態內存分配與二重指針(下)

-1 oid eof 元素 num inter alloc 內存分配 定義

要實現指針作為函數形參,改變實參指針的值。一般有兩種做法:

  1. 使用雙指針,或者指針數組形式作為形參,將實參的地址傳入函數,也即要給形參傳入指針的地址

    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

  2. 利用返回指針的函數直接返回分配好內存的地址(動態(堆)內存分配你懂的)

接上篇:為一個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]);
    }
}

指針做參數的動態內存分配與二重指針(下)