关于数组与指针的小问题

lutong 2003-07-09 11:31:31
void f(int (*p)[])
{


}

int a[][2] = {2,3,4,5};
f(a);

我的问题是:
(1) 形参指针指向的类型为int [], 实参指针指向的类型为int [2], 为什么不相容? 类型相容到底有什么要求?

(2)为什么extern int a[10] 和 extern int a[]等价?
...全文
15 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lutong 2003-07-10
  • 打赏
  • 举报
回复
是不是可以这样理解:

对于一个定义
void f(int (*p)[])
{


}
而言,编译没有问题,说明符合语法要求。

但是,int a[][2] = {2,3,4,5};
f(a); 此时编译器对实参和形参进行匹配,
首先将实参转换为int (*a)[2],即指向两个整数的
数组的指针,由于形参对应于一个二维数组,
其第二维和实参不匹配,所以形参指针也就和
实参类型不相容,导致编译错误。

结论是,函数必须定义为:
void f(int (*p)[2] )
{
}

hex 2003-07-10
  • 打赏
  • 举报
回复
好像不是这样的。
还是gzlucky(Lucky)说得对,你的声明错了。
此外还可以给你几个例子:
int a[3][4];
int **p1;
int *p2[4];
int (*p3)[3];

p1=a;//ok
p2=a;//ok
p3=a;//ok

可以用二重指针完成你的函数。
pengzhenwanli 2003-07-10
  • 打赏
  • 举报
回复
(2)为什么extern int a[10] 和 extern int a[]等价?
因为extern int a[]只是一个声明,要到联接的时候才找定义,
只要编译器知道就行了。
型别相容
比如说指针和数组,
idontlikenickname 2003-07-10
  • 打赏
  • 举报
回复


void f(int (*p)[]) // 接收的参数是一个数组指针,该指针指向一个含有两个整型元素的数组.
{


}

int a[][2] = {2,3,4,5};

// 应该这样调用.
f(&a[0]);
f(&a[1]);
或者
f(a + 0);
f(a + 1);

gzlucky 2003-07-09
  • 打赏
  • 举报
回复
你应该定义为:

void f(int (*p)[2] )
{
}

这是一个多维数组,如果你不定义除第一维外的其他维数的下标值,系统是不和道如何访问这个多维数组的。

int a[10] 和 int a[] 都是一个一维数组,所以不需要标的,系统都知道如何访问。

69,369

社区成员

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

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