指針作爲函數參數,申請動態內存方法

寫一個內存申請函數:以指針爲目標,修改指針本身

void getptr(int **p,int num)
{
     *p=(int *)maccol(num*sizeof(int));
     return;
}
void main()
{    
    int *ptr; 
    int k; 
    getptr(&ptr,10);
    for(k=0;k<10;k++)
    { 
        scanf("%d",&ptr[k]); 
    }
}

錯誤的:

void getptr(int *p,int num) 
{
    p=(int *)maccol(num*sizeof(int)); 
    return;
}
void main()
{
    int *ptr;   int k; 
    getptr(ptr,10);
    for(k=0;k<10;k++)
        scanf("%d",&ptr[k]);
}

首先要說明的是int *ptr,這時候ptr指向一個不明確的地址,在這種情況下getptr(ptr,10);這一句傳一個地址給getptr裏面的p指針,這時候p指針獲得的是ptr指針的一個副本,確切的說是ptr指向的對象的內存地址,所以這種方式在函數裏面可以用來傳一個指針指向的數據,這個數據是引用,但是指針還是副本,就是p與ptr兩個所指的數據是一樣的,但是兩個在內存的地址是不一樣的. 而你這個程序要求的是給ptr動態分配內存,所以當分配了一塊的內存,並且這個內存的首地址賦給p,這時候p指向的東西改變了,但沒有影響到ptr指針.ptr指針指向的還是他原來的數據,只是p指針的數據改變了. 所以這種情況引入一個指針的指針,讓p指針指向ptr這個指針(而不是ptr的副本),這時候動態的分配的數據塊傳給*p,這個*p就是ptr,所以給ptr分配內存成功.

轉自:http://www.cnblogs.com/greatIDeas/archive/2010/11/24/1886915.html


解決我的問題:動態申請二維數組

#include <iostream>
using namespace std;

template <class T>
void get2array(T ***ptr, const int  &row, const int &column)
{
    *ptr=new T *[row];
    (*ptr)[0]=new T[row*column];
    for(int i=1;i<row;++i)
        (*ptr)[i]=(*ptr)[i-1]+column;
}

int main()
{
    int row,column;
    cin>>row>>column;
    int **ptr;

    get2array(&ptr,row,column);

    for(int i=0;i<row;++i)
        for(int j=0;j<column;++j)
            cin>>ptr[i][j];
    for(int i=0;i<row;++i)
        for(int j=0;j<column;++j)
            cout<<ptr[i][j]<<' ';

    delete []ptr[0];//這裏還不知道如何釋放???
    delete []ptr;

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章