思考...得到数组长度的问题???
下面这个函数:
void arrayTest(int str[])
{
..........
}
int main(int argc, char* argv[])
{
int a[5]={1,4,1,3,32,15};
arraytest(a);
return 0;
}
就是定义一个数组(非字符串),然后定义一个函数,函数的实参为int str[],在这个函数里有得到传入的数组的长度,由于数组名作参数时,传入后会自动转化成一个指针,就是退掉了数组长度的信息,所以无法得到其长度,只有另外多一个参数传入数组长度,但是:
为什么c++要把当数组名为函数参数时转化成为指针???
如果复制一个与数组名一样包含所有有关数组的信息的指针,这样不就可以求得其长度了吗?
那么怎么复制一个与数组名一样包含所有有关数组的信息的指针,并且把它作为参数传递给函数....
[解决办法]
传数组的引用
void fun (int (&p)[10])
[解决办法]
用vector代替普通数组。
[解决办法]
引用传递就可以了 ~
[解决办法]
为什么c++要把当数组名为函数参数时转化成为指针???
就一般情况而言,
传递时候进行退化,
在很多方面可以更简单 ......
比如,
如果不退化,
那么传递后还是数组,
就考虑 空间 问题, 需要把整个数组的内容都在函数栈上进行复制,
效率,不就 下去了么~~
[解决办法]
要面对现实,C/C++的一个根本原则是“高效”。
楼主如果想知道数组的长度,可以将长度参数作为另一个参数传入函数,或者像todototry说得那样用引用参数。
[解决办法]
恩,使用vector也是一个不错的选择。
[解决办法]
如果复制一个与数组名一样包含所有有关数组的信息的指针,这样不就可以求得其长度了吗?
---------------------------------------------------
这是不行的,数组的有关信息是编译器保存的,编译器知道它有多长,而这个compiler保存的信息是不能用指针访问到的。。。
[解决办法]
兄弟,你有没有认真看别人的回复啊,已经todototry回答了。
[解决办法]
不指明长度的能叫数组么。
可以用模板。
template <typename T>
void fun(T & a)
或者
template <typename T, size_t n>
void fun(T (&a)[n])
[解决办法]
前天去面试的时候, 一面试官问过我这个问题, 我直接说得不到..
从他的表情看不出答错没有, 反正后来给了我一个offer.
[解决办法]
如果复制一个与数组名一样包含所有有关数组的信息的指针,这样不就可以求得其长度了吗?
那么怎么复制一个与数组名一样包含所有有关数组的信息的指针,并且把它作为参数传递给函数....
--------------------------
对不起,你办不到
确切地说,你要做的事根本不存在?!
在c++里,数组并不包含除了指针以外的任何其他信息,包括长度
你可以用sizeof来得到一个数组的长度,是因为数组的长度是在编译期确定的
而实际上sizeof的计算也是在编译期完成的
数组长度信息早在编译结束之后就去掉了
想在运行时获得这个信息,是不可能的
个人理解,如果说错了,请指正
[解决办法]
现在看语言,总是编译期跟运行期有些地方分得不是很清楚
编译白学了,sigh...
[解决办法]
同意 mmqmjy(莫名其妙) 的说法
[解决办法]
其实没必要那么麻烦,要是真的想动态获得一个存储区的长度,那么该长度值就应该在分配存储区的时候额外分配一个内存变量来保存,C++里面可以有很多方法实现,比如结构,里面就可以用一个域来保存储区的指针,再用一个域来存储该存储区的长度就好了。而数组是编译器为程序硬性分配的存储区,是编译期分配的,运行期根本就没有关于它的长度的任何信息啊。
[解决办法]
-> 为什么c++要把当数组名为函数参数时转化成为指针???
这问题很可笑不是么?这是语法!
如果有直接的方法得到数组的长度,要ArrayList,Verctor这样的集合干吗?
[解决办法]
对于这个题目,可以用以下方法
void arrayTest(int str[])
{
int *p=a;
int count=0; //记录整形数组大小
while(*p!=0)
{
count++;
p++;
}
cout < < "非0整形数组大小为: " < < count < < endl;
p=NULL;
}
[解决办法]
不好意思,上面写错个变量
void arrayTest(int str[])
{
int *p=str;
int count=0; //记录整形数组大小
while(*p!=0)
{
count++;
p++;
}
p=NULL;
cout < < "非0整形数组大小为: " < < count < < endl;
}
[解决办法]
void fun (int (&p)[10]) //其实也没多大意思,还是靠人为定的
to ben_bear()
while(*p!=0) //你的代码测试过了?请问!=0根据什么条件?