两个数组作为实际参数传给被调用函数的时候,没有敲长度,但可以正常运行

根据K。N。KING的现代方法中说的,调用函数的时候实际参数的写法应该是sum_array(b//数组名,LEN//长度)

但是我修改了书中的例题,题目要求把外部变量放进main函数中,以便后面两个函数作为实参。如下
int main(void)
{
int num_in_rank[NUM_RANKS],num_in_suit[NUM_SUITS];
for(;;){
read_cards(num_in_rank//数组名1,num_in_suit//数组名2);
analyze_hand(num_in_rank//数组名1,num_in_suit//数组名2);
printf_result();
}
}
这种两个数组作为实际参数传递给被调用函数的书写格式。合法吗?书上的要求不一样。但是我运行了,程序是没问题的

c

4个回答

在解释你的问题之前先给你普及一点c++的常识。
函数的参数和返回值是不能为数组的,如果需要把数组提供给一个函数使用,通常的做法是提供该数组的首指针。举个例子:
void arr_manager(int ,int);
int main()
{
int arr[10]; //声明一个长度为10的int数组
int n=10;
arr_manager(arr,n);
...
return 0;
}
void arr_manager(int
arr,int n)
{
arr[5]=3;//允许使用数组表示法,等价于*(arr+5)=3
for(int i=0;i<n;i++)
{
(arr+i)=0;
}
}
你仔细看一下上面这个程序。
首先我们知道,数组名代表这个数组的首地址,我们通过把数组的首地址提供给arr_manager()函数实现了对它的操作,同时定义了变量n来跟踪数组的元素个数。
然而,c++允许程序员在写函数参数列表时将上述的int
arr写成int arr[]。这种写法的好处在于让调用该函数的程序员知道要提供的是一个数组的地址,但在实质上和int* arr是完全一样的。这个参数只提供首地址,这也是我们为什么要用另一个参数n来告知arr_manager()函数数组元素个数的原因,以免发生访问越界。
所以,在提供参数时是不用在方括号提供元素个数的,而且最好不要。
码字不易,如有帮助请采纳。

Q:这种两个数组作为实际参数传递给被调用函数的书写格式。合法吗?书上的要求不一样。但是我运行了,程序是没问题的

A:合法,数组是一块连续的内存(就像从一个大蛋糕上面分出了一个块小的、连续的蛋糕),描述这块内存只需要三个参数即可:首地址和长度,
只要知道这两个参数就可以正确的访问一块内存,至于长度参数是作为形参传进来的,还是一个全局变量,还是一个被调用函数里面的局部变量都可以,
重要的是这个长度是正确的即可。

不出错就是合法的,前提是结果没错

NUM_RANKS 和 NUM_SUITS应该是常量const值或者宏定义#define,那么在for循环遍历数组时使用这两个常量值函数参数中完全不用数组长度这个参数。
如果在数组做形参的函数中不使用常量值作为for循环的限制条件那就无法正确遍历数组:
void read_cards(int arr[])
{
sizeof(arr)==4; // arr在这里相当于指针,给read_cards函数传参也是外部数组的地址
}

whyyouhitme_
whyyouhitme_ 两个宏在main函数中作为实参
2 年多之前 回复
whyyouhitme_
whyyouhitme_ 谢谢您的回答,我在被调用函数中设置了形式参数代替这两个宏。运行结果是正确的。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐