int (*a)[]在作为形参时的问题

zslin2011 2012-11-08 10:38:09
int (*a)[];
定义一个指针,指向数组。这个语句中的数组元素个数可以省略。
void myFunction(int (*a)[10])
定义一个指针类型的形参,指向数组。
你认为这个语句中的数组元素个数能不能省略呢?为什么???????
...全文
461 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zslin2011 2012-11-14
  • 打赏
  • 举报
回复
CSDN人才辈出,谢谢以上所有材人们的回答,谢谢啦。
转角天边 2012-11-10
  • 打赏
  • 举报
回复
引用 9 楼 zslin2011 的回复:
引用 7 楼 moyan_min 的回复:必须要设置成void myFunction(int (*a)[10]),要不然没法运行;int (*a)[];这样声明作为形参肯定有问题,因为这样做列数不确定,也就是说[]里面表示的是列数多少不明白啊,你的意思似乎要表达形参a指向二维数组,可我怎么还是感觉a指向的是一维数组呢????能解释一下么?
我以前解释过这个问题 就int(*a)[10]这个式子来分析下 首先a是一个指针,它的类型是int(*)[10] 它指向的类型是int [10],也就是一个指向整形数组
Binzo 2012-11-10
  • 打赏
  • 举报
回复
二维数组的话,就不能省略。 但我更喜欢 array[][3] 的写法,这样就不用再指针数组和数组指针上纠结了。
名字到底多长 2012-11-10
  • 打赏
  • 举报
回复
java转来的,再次看c++10天了,第一次学还是大一的时候。。。不对的请指正。 所谓的指针指向数组说法是完全错误的,或者方便这么说罢了。 指针用sizeof运算符你试下也就4个字节存放地址,也就存放一个数组的首地址罢了。他怎么知道这个数组有多少元素,放哪去存这个length?? 举个例子:一维数组int *p = new int[10],也就是把首地址赋给p,越界与否是程序员自己控制的。sizeof p得到的就是4. 而 int a[10],sizeof(a)得到的是40. 和int(*p)[10]对比下,还认为这个p是指向一维数组么。把看*p看成Q,语法就是 int Q[10],这个不就是二维数组的行指针么。在fun(int(*p)[10])里面用sizeof *p返回值是10×4=40,说明它指向一个长度为10的数组,这个10就是括号里面的10的作用,也就是上面说的列。至于行的数目,和一维类似,它永远都不知道。 指针中能容纳的信息就是广义数组中的某个元素,这个元素可以是一个整型数据,可以是一个行数组,和foreach循环类似。
MrRaindrop 2012-11-10
  • 打赏
  • 举报
回复
1.可以省略是因为只是声明,没有做初始化,这个时候还没有分配内存,但是我做了个实验,如果把int ra[2][3]的名称ra赋值给它会出问题,所以这个指针声明出来没有意义 2.不能省略,因为实参传递时会和形参做匹配,不允许把一个int (*)[5] 传递给int (*)[10].
JiMoKuangXiangQu 2012-11-09
  • 打赏
  • 举报
回复
引用 6 楼 zslin2011 的回复:
引用 5 楼 JiMoKuangXiangQu 的回复: int (*a)[10]; 就是一个指向二维数组的指针,而且这个数组的第一维长度是10. 当int (*a)[10]作为定义时,我认为是定义了一个指针,这个指针指向一个具有10个元素的数组,该数组的元素为int类型,我总觉得是一维数组,怎么是二维数组呢?能否解释一下呢??
一维数组的指针是这样的: int arr10[10]; int *p = arr10; 二维数组指针: int arr2x3[2][3]; int (*p)[3] = arr2x3; 我所回复的代码在vs2008下测试通过,如果在其他的编译器下,可能情况会有所变化.
JiMoKuangXiangQu 2012-11-09
  • 打赏
  • 举报
回复
引用 8 楼 zslin2011 的回复:
引用 3 楼 JiMoKuangXiangQu 的回复: C/C++ code12345678910111213141516void myFunction(int (*a)[]){ int *p = (int *)a, i; for (i = 0; i < 10; i++) printf("%d, ", p[i]);} int main(void){ int ar……
看你用什么编译器了,有的编译器只会是一个警告.
v2nero 2012-11-09
  • 打赏
  • 举报
回复

int* p[10]  ; //定义的是一个有10元素的数组,成员类型为int*
(int*)p[10] ;//同上
int (*p)[10]; //定义的是一个指针,指向一个有10个int元素的数组。

qin_zhu 2012-11-09
  • 打赏
  • 举报
回复
引用 6 楼 zslin2011 的回复:
引用 5 楼 JiMoKuangXiangQu 的回复: int (*a)[10]; 就是一个指向二维数组的指针,而且这个数组的第一维长度是10. 当int (*a)[10]作为定义时,我认为是定义了一个指针,这个指针指向一个具有10个元素的数组,该数组的元素为int类型,我总觉得是一维数组,怎么是二维数组呢?能否解释一下呢??
你可以理解成这个指针指向某个而为数组的某一行,而这一行具有10个int型的元素,实在不理解建议可以看看《C和指针》这本书,会豁然开朗。
lvyilong316 2012-11-09
  • 打赏
  • 举报
回复
指向一维数组的指针就是指向数组单个元素的指针,也就是int*,指向二维数组的指针就是指向二维数组元素的指针,也就是指向一维数组的指针,如int(*a)[10],前者指针加一移动一个整数位置,后者移动一行
moyan_min 2012-11-08
  • 打赏
  • 举报
回复
int *a指向的是一维数组,但是int (*a)[10]指向的是列数为10列的二维数组
zslin2011 2012-11-08
  • 打赏
  • 举报
回复
引用 7 楼 moyan_min 的回复:
必须要设置成void myFunction(int (*a)[10]),要不然没法运行;int (*a)[];这样声明作为形参肯定有问题,因为这样做列数不确定,也就是说[]里面表示的是列数多少
不明白啊,你的意思似乎要表达形参a指向二维数组,可我怎么还是感觉a指向的是一维数组呢????能解释一下么?
zslin2011 2012-11-08
  • 打赏
  • 举报
回复
引用 3 楼 JiMoKuangXiangQu 的回复:
C/C++ code12345678910111213141516void myFunction(int (*a)[]){ int *p = (int *)a, i; for (i = 0; i < 10; i++) printf("%d, ", p[i]);} int main(void){ int arr10[10] = {1, 2, ……
代码不对,形参int (*a)[]中的数字不能省,省了编译出错。
moyan_min 2012-11-08
  • 打赏
  • 举报
回复
必须要设置成void myFunction(int (*a)[10]),要不然没法运行;int (*a)[];这样声明作为形参肯定有问题,因为这样做列数不确定,也就是说[]里面表示的是列数多少
zslin2011 2012-11-08
  • 打赏
  • 举报
回复
引用 5 楼 JiMoKuangXiangQu 的回复:
int (*a)[10]; 就是一个指向二维数组的指针,而且这个数组的第一维长度是10.
当int (*a)[10]作为定义时,我认为是定义了一个指针,这个指针指向一个具有10个元素的数组,该数组的元素为int类型,我总觉得是一维数组,怎么是二维数组呢?能否解释一下呢??
JiMoKuangXiangQu 2012-11-08
  • 打赏
  • 举报
回复
int (*a)[10]; 就是一个指向二维数组的指针,而且这个数组的第一维长度是10.
JiMoKuangXiangQu 2012-11-08
  • 打赏
  • 举报
回复
省略和不省略10,上面的输出结果都是一样的. int (*a)[10]; 不管放在那里,都是一个指针,下面的操作是完全匹配的赋值: int arr2x10[2][10]; a = arr2x10; 参看下面的代码:
#include <stdio.h>

void myFunction(int (*a)[10])
{
	int i, j;

	for (i = 0; i < 2; i++)
	{
		int *p = (int *)(a + i);
		for (j = 0; j < 10; j++)
			printf("%d ", p[j]);
		printf("\n");
	}
}

int main(void)
{
	int arr2x10[][10] = { 
		{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, 
		{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, 
	};

	myFunction(arr2x10);

	getch();
	return 0;
}
JiMoKuangXiangQu 2012-11-08
  • 打赏
  • 举报
回复
void myFunction(int (*a)[])
{
	int *p = (int *)a, i;
	for (i = 0; i < 10; i++)
		printf("%d, ", p[i]);
}

int main(void)
{
	int arr10[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

	myFunction(arr10);

	getch();
	return 0;
}
max_min_ 2012-11-08
  • 打赏
  • 举报
回复
int *a[];//这里是需要设置长度的吧
void myFunction(int (*a)[])//这里可以不设置长度的
zslin2011 2012-11-08
  • 打赏
  • 举报
回复
不能省略!为什么两种情况下不一样????

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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