指针名直接作为参数传递给函数时{ int *p; fun(p) },传递的是指针的值,不是指针的地址,所以被调函数无法修改传入指针的值。
如果要对实参p做赋值操作,有两种方法,
1,传递实参的地址 &p
void fun(int **pp);
int *p;
fun(&p);
2,传递指针的引用,
void fun(int* &pp);
int *p;
fun(p);
定义一个C语言(创建、打印、删除)二维数组的函数。
/*************************************************************************
> File Name: new.cpp
> Author: ims
> Created Time: 2018/6/10 19:30:19
************************************************************************/
#include<cstdio>
void new1(int **&aa, int row, int column,int val=0) //aa要么用三级指针,要么用指针的引用。否则无法对实参赋值。
{
aa=new int* [row];
for(int i =0; i<row; i++)
{
aa[i]=new int [column];
}
for (int r=0; r<row; r++)
{
for (int c=0; c<column; c++)
{
aa[r][c]=val;
}
}
}
void new2(int ***aa, int row, int column,int val=0) //三级指针
{
*aa=new int* [row];
for(int i =0; i<row; i++)
{
(*aa)[i]=new int [column]; //(*aa)[i]等价于 *(*aa+i)
}
for (int r=0; r<row; r++)
{
for (int c=0; c<column; c++)
{
(*aa)[r][c]=val; //等价于 *( *(*aa + r)+c)
}
}
}
void dele(int **&aa,int row)//
{
for (int i =0; i<row; i++)
{
delete []aa[i];
}
delete []aa;
aa=NULL;
}
void print(int **&aa, int R, int C)
{
for (int r=0; r<R; r++)
{
for (int c=0; c<C; c++)
{
printf("%d ",aa[r][c]);
}
printf("\n");
}
}
int main()
{
int rows=2;
int cols=4;
int **aa;
new1(aa,rows,cols,1);
print(aa,rows,cols);
dele(aa,rows);
new2(&aa,rows,cols,2);
print(aa,rows,cols);
dele(aa,rows);
return 0;
}