一、函数的参数什么时候用int **a
函数定义中参数叫形参。函数调用时,调用者使用的参数数据为实参。
当实参是一维指针变量的地址时,形参要用二维指针。
如:main()
{
int *p; //定义一个指针变量p,p也有自己的存储地址,p中可以存放别的整型变量的地址
int i=123;
p=&i ;
init_i( &p) ; //传p的地址过去。p中存的是i的地址
}
init_i( int **a )
{
printf("val=%d\n" , **a ); //*a是i的地址,**a是i的值
}
以上只是为了说明int **a的意义,即:当实参是一维指针变量的地址时,形参要用二维指针。
二、int a[]
当实参是个数组时,形参我们一般这样写int a[],也可以写成 int *a
它们所表示的意义是,传递数组的首地址到子函数中!
三、int (* a)[10] 这里括号中的10不可少!
这叫数组指针,即a是个指针,它的数据类型是个int[10](有10个元素的数组)。
a+1 会跳过一个int[10]的空间
a+2 会跳过两个int[10]的空间
当实参为二维数组时,会这样传递参数,如:
main()
{
int aa[3][10]; //定义一个二维数组aa
init_i( aa ,3 ) ; //传aa的值(数组首地址)过去,同时,告诉子函数有几行
}
init_i( int (*a)[10] , int n )
{
int i,j;
for( i=0;i
a[i][j]=i*j ; //可以按二维数组操作a
}
可以理解为 int **a <=> int (*a)[] // 均是二维指针,一般用来计算二维的数组问题
int a[] <=> int *a // 一维指针,解决单维度的数组问题
int **a 保存的是int *指针的地址,本质上也是一个指针-------即用来保存地址的变量
给个例子重点说明下int**:
#include
int main()
{
int a[2] = { 1, 2 };
int **b = (int **)a;
printf("*b=%d", *b); // 对b只进行一次解引用,*b=a[0]=1;
/* 把a的首地址由“数的地址”强制转化成“指针的地址”(虽然b它只会接受“指针的地址”,但这里实际保存的是一个“数的地址”,只是通过强制转换欺骗了b而已。因为不管是什么的地址,形式都一样,都仅仅是一个长整型值而已。只是编译的时候解释不同,才使它们有了类别之分。)*/
/* b进行一次解引用,它告诉我们二维指针可以做一维指针的事情!这说明,不管维度多少,它本质就是一个指针-----一个保存地址的变量!关键在于你怎么去解释它。
* * 而不同维度的指针唯一不同之处,就在于它能够进行解引用的次数!而这个区别,是将它们区分开来的关键! */
}
int* 是整形的指针,指针的下标其实就是偏移量。比如int *a... a[4]其实就是a+4的地址指向的整形(如果指针未越界的话)。这其实和数组是一样的。
数组也可以使用指针的形式来访问 比如int a[10] &a[0]+4也就是取a[4]
有了上面的知识,楼主可以试着解释一下自己的问题。