计算机数组作为函数形参的一些基本问题
2017-07-28 16:40
253 查看
在C或者C++中求一个数组的大小的方法为sizeof(数组名) / sizeof(数组的第一个元素),对于int array[ ] = {1, 2, 3, 4, 5};数组的大小也就为sizeof(array) / sizeof(array[0])。但是对于如下程序,输出结果会怎么样呢?32位系统下指针为4个字节,64位系统下的指针为8个字节。
void sort(int arr[])
{
cout << "sort函数中数组的大小:" <<
sizeof(arr) / sizeof(arr[0]) << endl;
}
int main(int argc, char **argv)
{
int arr[] = {1, 2, 3, 4, 5, 6};
cout << "main函数中数组的大小:" <<
sizeof(arr) / sizeof(arr[0]) << endl;
sort(arr);
return 0;
}
输出结果为:main函数中数组的大小:6
sort函数中数组的大小:1
前一段时间写一个程序中,出现这个问题,就着手把C和C++中的数组问题整理一下。
在C和C++中,当数组作为形参时,虽然形式上还是数组,比如void sort(int arr[ ]),但是并不意味着真正建立了一个包含和实参数组大小相同的数组,在调用函数时也不对它分配存储单元,只是用array[ ]这样的数组形式表示array是一维数组名,来接收实参传来的地址,因此array中的方括号的数值并无实际作用,编译器对数组维度进行忽略。因此,将函数声明为如下两种形式是等价的:
void sort(int array[])
void sort(int array[6])
其实函数的形参接收的就是数组元素的首地址,int型指针是32位的,所以sizeof(arr)等于4,而arr[0]也是int型数据,
sizeof(arr[0])也为4,所以结果为1。因此要单独设置一个形参来接收数组的大小:
[cpp] view
plain copy
print?
void sort(int arr[], int length)
下面总计一下一维或多维数组名做函数形参时的相关知识点:
1. 如果函数实参是数组名,形参也应为数组名或指针变量,形参不能声明为普通变量,实参数组与形参数组类型应一致
2. 数组名代表数组元素的首地址,并不代表数组中的全部元素,因此用数组名作函数实参时,不是把实参数组元素的值传递给形参,而只是将实参数组的首地址传递给形参,形参可以是数组名,也可以是指针变量,他们用来接收实参传来的地址,这样,实参数组和形参数组就共占同一段内存单元。因此改变形参数组元素的值将同时改变实参数组的值,这样做排序时,将要排序的数组传递到函数中,主调函数中的数组也已经排好序了。
3.多维数组
如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定数组的第二维大小,且应与实参的第二维的大小相同,第一维的大小可以指定,也可以不指定。下面两种声明就是错误的:
int arr[ ][ ] 和 int arr[2][ ]
在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同
另外提一点,因为形参数组名和实参数组名指向相同的空间,调用函数中形参的操作会影响主调函数中的数组,所以对于新手来说,不要想着函数返回数组。C++中规定,函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针或指向数组元素的指针的指针。
void sort(int arr[])
{
cout << "sort函数中数组的大小:" <<
sizeof(arr) / sizeof(arr[0]) << endl;
}
int main(int argc, char **argv)
{
int arr[] = {1, 2, 3, 4, 5, 6};
cout << "main函数中数组的大小:" <<
sizeof(arr) / sizeof(arr[0]) << endl;
sort(arr);
return 0;
}
输出结果为:main函数中数组的大小:6
sort函数中数组的大小:1
前一段时间写一个程序中,出现这个问题,就着手把C和C++中的数组问题整理一下。
在C和C++中,当数组作为形参时,虽然形式上还是数组,比如void sort(int arr[ ]),但是并不意味着真正建立了一个包含和实参数组大小相同的数组,在调用函数时也不对它分配存储单元,只是用array[ ]这样的数组形式表示array是一维数组名,来接收实参传来的地址,因此array中的方括号的数值并无实际作用,编译器对数组维度进行忽略。因此,将函数声明为如下两种形式是等价的:
void sort(int array[])
void sort(int array[6])
其实函数的形参接收的就是数组元素的首地址,int型指针是32位的,所以sizeof(arr)等于4,而arr[0]也是int型数据,
sizeof(arr[0])也为4,所以结果为1。因此要单独设置一个形参来接收数组的大小:
[cpp] view
plain copy
print?
void sort(int arr[], int length)
下面总计一下一维或多维数组名做函数形参时的相关知识点:
1. 如果函数实参是数组名,形参也应为数组名或指针变量,形参不能声明为普通变量,实参数组与形参数组类型应一致
2. 数组名代表数组元素的首地址,并不代表数组中的全部元素,因此用数组名作函数实参时,不是把实参数组元素的值传递给形参,而只是将实参数组的首地址传递给形参,形参可以是数组名,也可以是指针变量,他们用来接收实参传来的地址,这样,实参数组和形参数组就共占同一段内存单元。因此改变形参数组元素的值将同时改变实参数组的值,这样做排序时,将要排序的数组传递到函数中,主调函数中的数组也已经排好序了。
3.多维数组
如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定数组的第二维大小,且应与实参的第二维的大小相同,第一维的大小可以指定,也可以不指定。下面两种声明就是错误的:
int arr[ ][ ] 和 int arr[2][ ]
在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同
另外提一点,因为形参数组名和实参数组名指向相同的空间,调用函数中形参的操作会影响主调函数中的数组,所以对于新手来说,不要想着函数返回数组。C++中规定,函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针或指向数组元素的指针的指针。
相关文章推荐
- 数组作为函数形参时应注意的问题
- 数组作为函数形参时应注意的问题
- C99中变长数组作为函数形参的问题
- C++中数组以及多维数组作为函数参数时的一些问题
- C语言中实参和形参问题&&函数使用数组作为参数的问题
- 指针作为函数的形参,给指针所在地址赋值问题
- (转)数组名、数组名取地址以及作为函数传递带来的问题
- 函数中的形参问题(指针形参、引用形参、二重指针作为形参)
- 在函数中以数组作为形参的方法
- 数组作为函数的参数的基本知识要点
- 二级指针、数组指针、二维数组、指针数组作为函数形参时可传入的实参
- 数组作为函数参数的指针问题
- 跟着郝斌学数据结构(06)——队列(数组队列基本的一些问题)
- C/C++中数组名作为函数形参
- 数组作为函数参数时的传递问题
- 关于 Numpy 数组作为函数参数的一个小问题
- 在函数中以数组作为形参的方法
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- C++用指针变量作为函数的参数接受数组的值的问题的总结
- 作为函数形参的数组,在函数体内,数组名仅仅是个指针