C++中定义函数时,函数的参数什么时候用int **a ?与直接用int a[]和int (* a)[]有什么区别呢?求详解?

 我来答
kaixingui2012
2012-11-04 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6310万
展开全部
一、函数的参数什么时候用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<n;i++ )
for( j=0,j<10;j++ )
a[i][j]=i*j ; //可以按二维数组操作a
}
zyd427
2012-11-04 · TA获得超过354个赞
知道小有建树答主
回答量:191
采纳率:0%
帮助的人:233万
展开全部
可以理解为 int **a <=> int (*a)[] // 均是二维指针,一般用来计算二维的数组问题
int a[] <=> int *a // 一维指针,解决单维度的数组问题
int **a 保存的是int *指针的地址,本质上也是一个指针-------即用来保存地址的变量

给个例子重点说明下int**:
#include <stdio.h>
int main()
{
int a[2] = { 1, 2 };
int **b = (int **)a;
printf("*b=%d", *b); // 对b只进行一次解引用,*b=a[0]=1;

/* 把a的首地址由“数的地址”强制转化成“指针的地址”(虽然b它只会接受“指针的地址”,但这里实际保存的是一个“数的地址”,只是通过强制转换欺骗了b而已。因为不管是什么的地址,形式都一样,都仅仅是一个长整型值而已。只是编译的时候解释不同,才使它们有了类别之分。)*/

/* b进行一次解引用,它告诉我们二维指针可以做一维指针的事情!这说明,不管维度多少,它本质就是一个指针-----一个保存地址的变量!关键在于你怎么去解释它。
* * 而不同维度的指针唯一不同之处,就在于它能够进行解引用的次数!而这个区别,是将它们区分开来的关键! */
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
peacexf
2012-11-04 · TA获得超过293个赞
知道小有建树答主
回答量:476
采纳率:100%
帮助的人:404万
展开全部
int* 是整形的指针,指针的下标其实就是偏移量。比如int *a... a[4]其实就是a+4的地址指向的整形(如果指针未越界的话)。这其实和数组是一样的。
数组也可以使用指针的形式来访问 比如int a[10] &a[0]+4也就是取a[4]

有了上面的知识,楼主可以试着解释一下自己的问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式