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


C中的動態內存分配問題:

格式:Int *pointer;

Pointer = (int *)malloc(100 * sizeof(int));

可以在被調用函數(該函數返回指針的函數)中動態分配內存,(並且該內存是分配在堆內存中的,故而被調函數可以返回指向該堆內存的指針),然后返回該指針值,該指針指向動態分配的內存,然后可以在主函數freepointer。哪怕在主函數中將該指針值賦值給pointer_2freepointer_2也是可以的,(可以理解的,它們都指向該堆內存),以避免出現內存泄漏。

對二維數組的動態內存分配與釋放,我們知道在C++中直接int *pointer = new int[3][4]; 然后delete []pointer即可,C++可以直接對二維數組進行動態內存分配與釋放。但是在C中,要么動態內存分配pointer= int *)malloc(12 * sizeof(int)),也即直接分配一塊連續的內存存放12個數組元素,而后free一次pointer;要么分配3塊連續的動態內存分別存放4的數組元素,而后free三次pointer。后者需要用到指針數組來存放3個動態內存指針:int *pointer[3];注意與指向一位數組的指針區別:int (*pointer)[3].

第二種方法是挺復雜的。涉及到指針數組的動態內存分配問題。二重指針通常與指針數組一同使用,也即定義一個二重指針指向指針數組,可以理解的兩種方法范例源代碼見下篇。

二重指針與指針數組的使用也是一定要注意的,還不熟練。

int **pointer;

int *pointer_array[4];        //指針數組要對數組元素賦值,也即對數組里面的指針元素賦地址值,而非對指針元素指向的整型數據賦數值,otherwise編譯出錯

pointer = pointer_array;      //指針數組的數組名仍然代表地址

 

ATTENTION:

/** pointer = pointer_array + 1 //這是合法的,pointer + 1 代表了數組pointer_array中第二個指針元素的地址 pointer= pointer_array[1] //這是非法的,pointer_array[1]代表了數組pointer_array中的第2個元素,也即數組中盛放的第二個指針,
我們是想把第二個指針的地址賦給pointer,而不是把第二個指針賦給pointer,會報錯:error: cannot convert 'int*' to 'int**' in assignment pointer_array[1]僅僅是指針,而pointer是指針的指針。 *
*/

 上一段源碼: 

#include <stdio.h>

int main()
{
    int **pointer;
    int *p[3];
    int a = 1;
    int b = 2;
    int c = 3;
    p[0] = &a;
    p[1] = &b;
    p[2] = &c;

    pointer = p;
    //pointer = p[0];    ///好好研究此處啊,它和上一行是不同的!!!看看error!!

    printf ("%d\n", *(*(pointer + 2)));

    return 0;
}

 

如果要設計一個被調函數,該函數返回一個指向指針類型的指針,比如返回一個指針數組的地址,也就是返回一個二重指針,它的定義形式如下:  

Int **allocation(parameter_1, parameter_2, ...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM