寫一個內存申請函數:以指針爲目標,修改指針本身
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;
}