cos*_*ost 10 c++ arrays arguments
这感觉真是一个非常愚蠢的问题,但是我有人参加编程课程,请求我在作业上提供一些帮助,我在他们的代码中看到了这一点(请不要对匈牙利符号发表评论):
void read_dictionary( string ar_dictionary[25], int & dictionary_size ) {...
Run Code Online (Sandbox Code Playgroud)
其中,主要是C#程序员(我在大学时学过C和C++),我甚至都不知道你能做到.我总是被告知,并且从那以后你就读过了
void read_dictionary( string ar_dictionary[], int ar_dictionary_size, int & dictionary_size ) {...
Run Code Online (Sandbox Code Playgroud)
我被告知教授给了他们这个并且它有效,那么声明一个固定大小的数组甚至意味着什么呢?C++没有本地方式知道传递给它的数组的大小(即使我认为可能在最新的规范中已经改变)
Wea*_*Fox 11
在一维数组中它没有意义,编译器会忽略它.在二维或更多维数组中它可能是有用的并且被函数用作确定矩阵(或多维数组)的行长度的方式.例如 :
int 2dArr(int arr[][10]){
return arr[1][2];
}
Run Code Online (Sandbox Code Playgroud)
此函数将arr[1][2]
根据指定的长度知道地址,并且编译器也不应接受此函数的不同大小的数组 -
int arr[30][30];
2dArr(arr);
Run Code Online (Sandbox Code Playgroud)
是不允许的,并且是编译器错误(g ++):
error: cannot convert int (*)[30] to int (*)[10]
Run Code Online (Sandbox Code Playgroud)
该25
参数声明是由编译器忽略.这跟你写的一样string ar_dictionary[]
.这是因为数组类型的参数声明被隐式调整为指向元素类型的指针.
所以以下三个函数声明是等价的:
void read_dictionary(string ar_dictionary[25], int& dictionary_size)
void read_dictionary(string ar_dictionary[], int& dictionary_size)
void read_dictionary(string *ar_dictionary, int& dictionary_size)
Run Code Online (Sandbox Code Playgroud)
即使在第一个函数的情况下,显式声明了数组的大小,sizeof(ar_dictionary)
也会返回相同的值sizeof(void*)
.
#include <string>
#include <iostream>
using namespace std;
void read_dictionary(string ar_dictionary[25], int& dictionary_size)
{
cout << sizeof(ar_dictionary) << endl;
cout << sizeof(void*) << endl;
}
int main()
{
string test[25];
int dictionary_size = 25;
read_dictionary(test, dictionary_size);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(确切的值当然是依赖于实现的;这纯粹是出于示例目的):
4
4
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10643 次 |
最近记录: |