帮我解答一下,这个问题

ganpengjin 2010-05-22 10:12:31
puls(int *m,int *n)
{

//实行2个2维数组相加;


}



int main()
{
int a[2][2],b[2][2];
//
....


puls(a,b) //这里怎么传数据,传不过去!,是不能转换什么的,奇怪!高手请指点一下!

}


//............
...全文
130 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ganpengjin 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhao01081122heng 的回复:]
严格的说指针就是地址,指针变量是表示这个地址的变量,不过两者通常不区分,通常说这个指针变量就是指针;
普通类型的指针,如int *p, 这个p就可以指向一个int类型的变量,此处的*号只是为了定义p,说明它是一个指针。如int a=3; 那么p怎么指向a呢,很简单,取a的地址,牢记指针就是地址,p=&a。&就是取地址符,那么怎么得到p的值呢,那就用取值符号*,则int b=*p……
[/Quote]
作文啊!!!!
呵呵,不过还是很谢谢解答!
w908065729 2010-05-22
  • 打赏
  • 举报
回复
楼上好牛
Zhao01081122Heng 2010-05-22
  • 打赏
  • 举报
回复
严格的说指针就是地址,指针变量是表示这个地址的变量,不过两者通常不区分,通常说这个指针变量就是指针;
普通类型的指针,如int *p, 这个p就可以指向一个int类型的变量,此处的*号只是为了定义p,说明它是一个指针。如int a=3; 那么p怎么指向a呢,很简单,取a的地址,牢记指针就是地址,p=&a。&就是取地址符,那么怎么得到p的值呢,那就用取值符号*,则int b=*p就表示b等于p指针指向的值,即为3. 让我们记住两个符号 【&】和【*】。(注意下面的各种特殊情况)
当指针指向一个一维数组的时候,比如说int a[3]={1,2,3}. 那么int *p; p=a. 那么p指向的就是这个数组的首地址,所以a[0]=p[0],需要注意的是,和前面讲的区别,我们这里的p并没有加取值符,就可以得到实际的值,当然*p也可以得到第一个a[0]的值。同理:a[i]=p[i]=*(p+i)=*(a+1); 而且其地址也都是相同的:p=a=&a[0]。
当指针指向一个二维或多维数组的时候,事情又变得更有趣。比如说int a[2][2]={11,12,21,22}。首先讨论其自身的指针问题(也就是没有创建新的指针变量的情况下),这个时候a就被拆开为a[0]和a[1]两个一维数组,而此时a[0]并非对应的某个值,它对应的是第一个一维数组的首地址,也就说它是个地址,而根据上面我们知道一维数组中,a[i]=*(a+i), 而这本身就是a的首地址,当然可以用&a表示,所以很奇怪的一个等式居然成立了: a[0]=*a=&a. and a[1]=*(a+1)=&a[1]; 即:a[i]=*(a+i)=&a[i]。 可以发现:我们在前面一直区分的取值符号*和取地址符号&,在这里居然从某种意义上讲等价了,当然不是,我们要从意义上分析,这也只局限于当前这种环境,这里面只是列举了多种表示地址的方式而已。当然,地址有等式,值也有,在二维数组中,取值一般形式:a[0][1], (取第一个数组的第二个值的地址,就需要a[0]+1,或者*a+1,或者&(a[0][1]);)这里也等价于上面任何一个地址之前再加一个取值符号*,如:*(*a+1). 此时,如果一个数组指针变量p指向a,则:p=a; a[0]=p[0]=*p, 可以推出:a[1][1]=*(*(p+1)+1), 即: a[i][j]=*(*(p+i)+j). 其中的括号非常有意思,(P+i)就表示以维度为级别推进,p是第一个数组,p+1就是第二个的了,而后面的*(P+1)+j中的j可就只能是列数推进了,只表示相见推进了j列。所以区分好很重要奥。必须必须指明的是:不是随便的p就可以指向这个二维数组的,它必须这样定义 int (*p) [2] ,两点注意:1: *p前后的括号不能少,2: [2]表示二维数组的列数。如果是int a[3][4], 则指向它的指针就应这样定义 int (*p)[4]. 明白了吧,其实这个指针就是一个一维数组类似形式的了。但是要知道,这不是指针数组,指针数组是不需要括号的。要注意区分。
当指针指向字符串时,更特殊了。一般情况下: char a='q'; char *pa; pa=a; 则*pa就能取出值为'q'. 这是最一般的情况,运用最通用的*和&。但是,if : char *ps=" csdn", 那么这个时候ps就直接代表这个字符串的首地址,而且你甚至可以把这个ps当做其他语言中的string使用,比如你直接打印它: printf("%s",ps), 或者定义一个替换字符串,如char *pf="%s", 你就可以在printf中用pf代替这个"%s", 即: printf(pf,ps); 多么神奇啊!我居然没有使用取值符*,就代表了整个字符串!————当然这个时候,还要知道*ps仍代表这个字符串的首字符'c'。而且*(ps+1)会指向第二个字符's'。并由此衍生了一个nx的赋值语句,情景:if: char *pss="josay", *psd, a[10]; 且pad=a. 此时如果你想把pss的值付给psd,而且pad能够同时更新a,那么这是我见过的最令我记忆深刻的一个赋值函数(语句),这个函数里面的两个形参就是char *pss, char *psd. 然后就一句话:while(*psd++=*pss++).这里首先是while循环,然后是赋值*psd=*pss(就是第一个字符c).然后两个指针都向后移动。终止条件本来应该是判断最后一个值是'\0',但由于其ascii值刚好为0,随意直接拿其值判断了,oh, i cant believe,真是太牛了。再加上通过函数调用,不会让pss和psd的指向地址发生变化,但其psd指向地址的值却发生了变化,也就是数组a被赋值了。如果你直接使用 while(*psd++=*pss++).而不是把它写到一个函数中再调用,那么你需要把pss和psd都减去移动的次数,才能回到原来的地址指向。还要补充一点:psd就代表整个字符串csdn,那么psd+1可就输出为sdn。妙吧,想想c#我们想截断一个字符串还要引用函数写n个参数才ok啊。
当指针指向结构时,一个新的符号产生了->。下回分解。
KevinHo 2010-05-22
  • 打赏
  • 举报
回复
LZ,二维数组,要理解为二级指针。
不知道LZ有没有二维数组的动态分配的形式,
比如:

int a[2][2]可以这样动态实现内存分配 :
int **p = (int *) malloc (sizeof(int *) * 2);
for (int i = 0; i<2; i++)
*p[i] = (int) malloc (sizeof(int) * 2);


可见,二维数组的数组名实质上是一个二维指针,只不过作为数组,它是一个常量(也就是说,a不能作为左值,出现在赋值号左边,被赋予其它地址值),所以在进行函数参数传递的时候,要以二级指针的形式作为形式参数,不能以一个普通指针来传递,这样的话就出现了类型不匹配的情况了。
ganpengjin 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhzxlc_06 的回复:]
C/C++ code
void puls(int (*m)[2],int (*n)[2]) // 这样是二维的,您那样写只能传递一维数组
{

}

int main()
{
int a[2][2],b[2][2];
puls(a,b);
return 0;
}
[/Quote]
我假如要传递a[2][3],b[3][2]进行相乘呢?
是什么样的格式?
chaoliu1024 2010-05-22
  • 打赏
  • 举报
回复
void puls(int (*m)[2],int (*n)[2]) // 这样是二维的,您那样写只能传递一维数组
{

}

int main()
{
int a[2][2],b[2][2];
puls(a,b);
return 0;
}
localxiao 2010-05-22
  • 打赏
  • 举报
回复
指针类型不匹配

int a[2][2] 作参数的时候退化成 int (*a)[2];

所以把puls函数的定义改成

puls(int (*m)[2], int (*n)[2]);

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧