传递整个数组作为参数时,为什么还需要数组的长度作为参数

作者&投稿:赤图 (若有异议请与网页底部的电邮联系)
小白 求教大神, 数组作为参数传递给函数时,传入后 为什么数组的长度 计算不正确了?~

因为你理解全错了!数组是不能传递给函数的,传递给函数的只是数组的指针。对一维数组来说,传递的就是数组的第一个元素(下标为0的元素)的地址,所以在函数中要用sizeof测所占的话就只有一个指针所占的4个字节——题面中说的“为什么数组的长度”不正确其实也不对,sizeof不是测“长度”的,只测代码分配给变量的内存单元数目的。

a是指针数组,元素是char指针 ,数组传递的时候编译器只会传递数组地址,也就是a的地址,是指针数组的地址。
进入函数时,复制了份指针数组的地址,而不是数组本身。
函数内
char *p="add";//先在常量区放入"add",并将地址赋值给p
a[1]=p;
将p的值也就是常量字符串的地址赋值给a指向的数组中的第二个元素(元素类型是char *),这就改变了实参a数组中第二个元素指针的指向,它指向了常量区的"add"。

由于此时a是个char *数组的地址副本,是局部变量,即形参,函数退出时会被退栈;而p本身是个指针,它也是个局部变量,在函数退出时会被退栈,但不会影响常量区,也就是说"add"字符串不会被释放,只在整个程序退出时释放。

传递数组作为参数时只传递了数组在内存中的首地址,但对于数组有多大,必须由数组长度来确定。否则的话函数中对于数组的操作可能会越界,即对原本不属于数组的内存进行了修改,这样可能会导致程序出错。
当然,假如你能用其他方法来判断数组的结束地址,比如数组的最后一个元素设为一个特殊值,那么你也可以不用传递数组长度。

可以呀,当你函数不用到相关数组的长度时,或通过全局变量定义其长度,传递数组长度是为了使用方便及在使用时防止使用数组越界。

传递数组作为参数,实际上传递给函数这个数组的首地址。所以需要传递长度。

只要不是有确定的结束标志(如字符串),就该传递长度
不然程序怎么知道你的数组有多长?
这又不是java

为了使用for循环


传递整个数组作为参数时,为什么还需要数组的长度作为参数
传递数组作为参数时只传递了数组在内存中的首地址,但对于数组有多大,必须由数组长度来确定。否则的话函数中对于数组的操作可能会越界,即对原本不属于数组的内存进行了修改,这样可能会导致程序出错。当然,假如你能用其他方法来判断数组的结束地址,比如数组的最后一个元素设为一个特殊值,那么你也可以不...

C语言不允许将整个数组作为函数的参数进行传递。 请问这句话对吗...
C语言不允许将整个数组作为函数的参数进行传递。 这句话是对的!如果确有这种需要,可以使用指针来达到目的。

数组做函数参数时,将整个数组的元素传递给形参数组错在哪?
当数组作为函数参数传递时,只有指向数组第一个元素的指针传递给函数。数组的大小不会随指针一起传递。这意味着该函数无法知道原始数组的大小,只能访问指针边界内的元素。如果要将整个数组传递给函数并让该函数对整个数组进行操作,则可以将数组的大小作为附加参数传递。例如:void modifyArray(int arr[], ...

vb数组作为函数参数
Call sort(xulie) '将数组名作为参数,可以传递整个数组,而用xulie(50),相当于只是把其中一个元素作为参数 private sub sort(xulie() as integer) '同样的,将数组名作为参数 ,不要指定数组大小

数组作为参数传递的是什么?
传递的是地址,参数地址所指向的内容可能在函数中被修改

C语言中,数组名作为函数参数,属于什么传递,为什么?
C语言中,数组名作为函数参数,属于数组参数传递。在VB6.0中,允许使用数组作为实参传递到子过程的形参中,数组传递必须采用地址传递的方式来传递参数。数组型变量名本身只是该数组所占存储空间的首地址,函数调用时,系统不会为形参分配数组存储空间,而是仅仅分配一个存放数组地址(第一个元素地址)的存储...

在C语言中,数组作为参数,是怎样在函数之间传递的啊??
数组作为参数是按地址传递的 数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

java中数组是怎么作为函数参数进行传递的
传递数组参数:1. 传递数组 要传递数组到方法里,只要指明传入的参数是一个数组即可。例:public class ArrayDemo \/\/定义主类 { public static void main(String args[]){ int a[]={8,23,7,6,9,23}; \/\/定义一维数组 ArrayDemo min=new ArrayDemo (); \/\/创建对象 min....

数组作为参数传递,麻烦给看一下
可以写成char a[M][N]的形式,也可以写成char a[][N]的形式。另外,由于静态数组的单元是连续的,也可以转成一维数组传入,并在其它参数中指明二维数组的长和宽。不过在函数中访问时需要做对应的转换。2 动态二维数组,即 char ** p;在p上分配的二维数组,本质上为二维指针。 可以直接以char *...

C语言函数 数组作为参数,,在函数里中无法计算传进来的数组长度求指教...
整型数组作为参数传递时,无法在子函数获得其长度!只有字符串可以,因为它有一个尾巴标识(‘\\0’)!所以,整型的数组长度,必须与数组名一同传递到子函数才可以!

苏州市17734115553: 传递整个数组作为参数时,为什么还需要数组的长度作为参数 -
呈青米非: 传递数组作为参数时只传递了数组在内存中的首地址,但对于数组有多大,必须由数组长度来确定.否则的话函数中对于数组的操作可能会越界,即对原本不属于数组的内存进行了修改,这样可能会导致程序出错. 当然,假如你能用其他方法来判断数组的结束地址,比如数组的最后一个元素设为一个特殊值,那么你也可以不用传递数组长度.

苏州市17734115553: C中怎么将数组作为参数全部传递给下一个函数 -
呈青米非: 1、因为数组在内存中是一块连续的内存,只要将该数组的首地址传进去,当然就可以访问整个数组了.值得注意的是,由于只传了首地址,函数不知道数组的维数,所以还得把数组的维数传进去,那就可以完全操作该数组了.2、例:有一个函数声明:void fun( int aa[],int size );或者void fun( int *pa,int size ); 以上两种声明都一样.调用上诉函数时:假设有 int ab[10]; fun( ab,10 )就可以了.

苏州市17734115553: 数组作为函数参数时,为什么往往必须再利用c语言中另一个参数来传入数组的大小.可以举个大码例子吗
呈青米非: 传数组,实际是传的指针,需要一个参数让函数里知道,数组大小

苏州市17734115553: C语言不允许将整个数组作为函数的参数进行传递. 请问这句话对吗? -
呈青米非: C语言不允许将整个数组作为函数的参数进行传递. 这句话是对的!如果确有这种需要,可以使用指针来达到目的.

苏州市17734115553: c语言 数组作为参数传递 -
呈青米非: 调用时把【】去掉,表示掉用这个数组的所有元素,数组的名称表示数组第一个元素的地址.数组的定义可以写成: int table[]={1,2,3,} 或者table[3],不能写成table[],因为系统在定义数组时就给数组分配了地址,table[]没有确定元素的个数,不能分配地址空间.但是作为形参,可以这样写,void tab(int table[]) ,不知道为什么,呵呵

苏州市17734115553: 数组作为参数传递的是什么? -
呈青米非: 数组作为参数传递的是地址,传递时是将数组的首地址传给相应的参数,接受数组的参数要么一个数组,要么指针类型的变量

苏州市17734115553: 如何传递同一个数组作为多个函数参数进行操作? -
呈青米非: 问题有点不能理解.1、C语言里面不管有多个函数,执行的过程肯定有个先后顺序.不能并行执行.你要把一个数组传递个多个函数,第一个函数操作数组后数组肯定发生了变化 2、每个数组的内容是一样的?那么你可以每个函数里面定义一个数组,这样用的时候就把参数数组拷贝到函数里面定义的数组 3、还有一种比较笨重的方法.申请一个数组备份你要传递参数的数组.每次传递完后.把备份数组拷贝到你要传递的参数上.

苏州市17734115553: 求助:怎么将一个类对象数组传递到一个函数里面当参数 -
呈青米非: 数组作为参数是按地址传递的 数组名就是数组的首地址.因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名.形参数组名取得该首地址之后,也就等于有了实在的数组.实际上是形参数组和实参数组为

苏州市17734115553: 函数 数组形参为什么要加 [ ] -
呈青米非: 数组名是数组的首地址,这点上来说和指针并无区别 当传入到函数作为参数时,由于函数形参是实参类型必须一致,所以传入的数组名要加[],或者等价的*;如下 int man( int a[] , int n ); int man( int *a , int n );

苏州市17734115553: C语言 数组作为参数传递问题 -
呈青米非: 不是写法的问题,可能你对数组的具体含义还不太清楚哈.一个一维数组的数组名是指向这个数组首地址的指针,比如:int a[3]={1,2,3}; printf("%d",*a); 输出:1 a就是指向这个数组的首地址的指针,当用:int *b; b=a+1;//a地址加1,指向下...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网