指针传递问题

来源:百度知道 编辑:UC知道 时间:2024/05/05 15:52:56
#include <iostream>
using namespace std;
void fmax(int *p);
int main()
{int a[5][5]={{0},{0,-5,4,6},{5,3,7},{12,-3},{23}};
fmax(a[0]);} 为什么此处将a[0]改成a就错了,a是第一个地址,应该和a[0]是一样的阿,传给p就好了,请指教~

void fmax(int *p)
{cout<<*(p+1)<<endl;}

是这样的,二维数组有一个行指针与列指针的概念,行指针即横向的指针,加1即跳过一行,列指针即纵向的指针,加一即跳过一个数据,
这个在潭浩强的书上已经讲得很详细了,建议楼主看一下。由于这种原因,所以c中用两个不同的指针变量来分别表示这两种不同的指针。
针对这道题,void fmax(int *p)中的参数是一个指向int型的指针,只有列指针是指向列的,a[0]是列指针,而a是行指针,此时void fmax(int *p)中的参数应改成void fmax(int (*p)[5])即可。
举一些例子:
行指针有:a a+1 ,a+2
列指针有:a[0] a[1]等。
指针比较复杂,需楼主再花些工夫啊。

C++比C的类型检查更加严格,所以这个程序在C上能通过的但是C++就不行了。确实正如你所说a[0]和a实际上值是一样的,不过从编译器来看它们的语义又不同。a是int [5][5](可以等价于int (*)[5]),而a[0]是a[5](可以等价于int *)