指针是可变数组的首地址,正因为是可变数组,所以一般使用指针都是采用动态内存分配和释放的方式。一尾指针形式简单,容易理解,平时应用较多
二维数组和二维指针比较复杂,并且在动态内存分配与释放方面比较复杂难以理解,但是二维数组和二维指针是非常有用的
void func1(int**p1,int **p2)
{
int **temp;
int *temp1;
int i;
temp1=(int*)malloc(sizeof(jint)*20); //申请20个Int的空间
temp=(int **)malloc(sizeof(int*)*20);//申请20个int*的指针空间
for(i=0;i<20;i++)
{
temp[i]=&temp1[i];//对每个指针进行赋值
}
**temp=**p1;
}
定义如下3个二维数组和二维指针进行说明:
1. int **ptr; //内存占用4个自己,也就是一个指针
2. int *ptr[M]; //neic 占用4*M个自己
3. int (*ptr)[M];//占用4个字节
以上都是存放整数的二维数组,并且可以通过ptr[i][j]的形式访问内容,但是它们之间有很大差别,一些依照文中提到的方面
进行分析。
三个ptr本身都是指针,并且是二维指针,但是它们的最终内容总是整数,但中间内容,如ptr[i]并不是正式,而是指针int*
1.int**ptr 表示指向(一组指向整数数据指针)的指针
2.int *ptr[M]是指针数组,表示指向(M个指向整形数指针)的指针
3. int(*ptr)[M]表示指向一组(指向包含M个整形数据的指针)的指针。
int **ptr;
int i,j;
ptr=(int**)malloc((sizeof(int*))*M); //长度为M每个都是一个指针
for(i=0;i<M;i++)
{
ptr[i]=(int*)malloc(sizeof(int)*N);
}
采用如上内存分配方法,意味将Ptr初始化为M*N的二维数组首地址
可以访问ptr[0:M-1][0:N:-1];
for(i=0;i<M;i++)
{
free(ptr[i]);
}
free(ptr);
使用上述方法分配内存,最终Ptr耗费的内存空间为M*sizeof(int*)+M*N*sizeof(int);
2.int *ptr[M]是指针数组,表示指向(M个指向整数指针)的指针,是一个二维指针,但是在定义的时候编译器已经为
ptr指向的M各指向整数的指针ptr[0:M-1]分配了内存,也就是说,定义之后即可得到ptr地址以及,要使用ptr必须对ptr[i]分配内存,分配内存之后,ptr地址
相应内存空间填入Ptr[i]指向内存地址,使用如下操作:
int*ptr[M];
int i,j;
for(i=0;i<M;i++)
{
ptr[i]=(int*)malloc(sizeof(int)*N);
}
采用如上内存分配方法,意味着将ptr初始化为M*N的二维数组首地址
for(i=0;i<M;i++)
{
free(ptr[i]);
}
3.int(*ptr)[M]表示指向一组(指定包含M个整形数据的指针)的指针,该定义限定了Ptr[i][0:m-1],
指针必须指向长度为M的数组,
int (*ptr)[M];
int i,j;
ptr=(int(*)[M])malloc(sizeof(int)*M*N);
for(i=0;i<N;i++)
{
//ptr[i]=(int [M])malloc(sizeof(int)*M);
}
采用如上内存分配方法,意味将ptr初始化为N*M的二维数组首地址
free(ptr);