社区
C语言
帖子详情
关于数组与指针的小问题
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[]等价?
...全文
65
5
打赏
收藏
关于数组与指针的小问题
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[]等价?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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[] 都是一个一维数组,所以不需要标的,系统都知道如何访问。
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章