C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
2010-09-14 10:00
627 查看
转自:http://blog.163.com/tianhit@yeah/blog/static/165747821201052195212719/
#include<iostream>
using namespace std;
int fun(int a[][3],int n) // 其中二维数组形参必须确定数组的第二维的长度,第一维长度可以不定
//int fun(int (*a)[3],int n) // 和 int fun(int a[][3],int n) 功能和用法完全相同
{
int sum=0;
for (int i=0;i<n;i++)
{
for(int j=0;j<3;j++)
sum=sum+a[i][j];
}
return sum;
}
void fun1(int a[2])
{
int n = sizeof(a); // 因为在实际函数调用时,传递来的实参都是指针,所有这里是对指针求sizeof,
// 而指针变量是int的整型变量。在vc++ 6.0中int类型变量占4字节,所以 n肯定是4
printf("%d/n",n);
}
int fun2(int a[],int n) //形参中可以不指定一维数组的大小。
{
int sum=0;
for(int i=0;i<n;i++)
sum=sum+a[i];
return sum;
}
int main()
{
int b[2][3] = {{1,2,3},{4,5,6}};
int a[3]={1,2,3};
int num=0;
int num2=0;
int i=2;
int *p=&i;
num=fun(&b[0],2); //ok
// num =fun(b,2); //ok
// num=fun(&b[0][0],2); // error C2664: 'fun' : cannot convert parameter 1 from 'int *' to 'int [][3]'
// num=fun(&b,2); // error C2664: 'fun' : cannot convert parameter 1 from 'int (*)[2][3]' to 'int [][3]'
// num=fun(b[0],2); // error C2664: 'fun' : cannot convert parameter 1 from 'int [3]' to 'int [][3]'
num2=fun2(&a[0],3); // ok
// num2=fun2(a,3); //ok
// printf("%d/n",num2);
// printf("%d %d %d %d %d %d/n",b[0],&b[0],b[0][0],&b[0][0],b,&b); //只有b[0][0]是数组元素,其他均为地址
// 结果: 1245032 1245032 1 1245032 1245032 1245032
// 结论:虽然 b[0],&b[0],&b[0][0],b,&b 的值都相同,但是它们所代表(指向)的类型可能就不一样,其中&b[0]和b所指
// 向的类型是相同的,b[0]和&b[0][0]的类型可以是认为是相当(注意是相当,不是相同)。
// C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针,
// 当N维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素(这里的首元素是个N-1维数组)首地址的指针,
// printf( "%d/n ",num);
// printf("%d %d %d/n",sizeof(*p),sizeof(p),sizeof(b)); // sizeof(b)是求数组里所有元素所占的内存总和
// printf("%d %d %d %d/n",*p,p,sizeof(&b[0]),sizeof(b[0]));
// sizeof(&b[0])是对指针,即数组b的第一个元素(当然它是个长度是3的一维数组)的地址作用
// sizeof(b[0])是对数组b的第一个元素(当然它是个长度是3的一维数组)的作用,相当于求长度是3的一维数组所有
// 元素所占内存和
// 结果:2 1245008 4 12 //其中1245008是p的值,即*p的地址
// fun1(a); //ok
// fun1(&a[0]);//ok
// fun1(&a);// error C2664: 'fun1' : cannot convert parameter 1 from 'int (*)[3]' to 'int []'
// printf("%d/n",sizeof(a));
return 0;
}
//*****************************************************************************
//二维数组的引用作形参时,注意事项。看例子
#include<iostream>
using namespace std;
int fun(int (&a)[2][3]) //ok,引用作形参,数组作引用形参,必须指定清楚所有维数
// int fun(int (&a)[ ][3],int n) //error C2265: '<Unknown>' : reference to a zero-sized array is illegal
// int fun(int &a[2][3]) // error C2234: '<Unknown>' : arrays of references are illegal
{
int sum=0;
for (int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
sum=sum+a[i][j];
}
return sum;
}
int main()
{
int b[2][3] = {{1,2,3},{4,5,6}};
int num=0;
num=fun(b);
printf("%d/n",num);
return 0;
}
#include<iostream>
using namespace std;
int fun(int a[][3],int n) // 其中二维数组形参必须确定数组的第二维的长度,第一维长度可以不定
//int fun(int (*a)[3],int n) // 和 int fun(int a[][3],int n) 功能和用法完全相同
{
int sum=0;
for (int i=0;i<n;i++)
{
for(int j=0;j<3;j++)
sum=sum+a[i][j];
}
return sum;
}
void fun1(int a[2])
{
int n = sizeof(a); // 因为在实际函数调用时,传递来的实参都是指针,所有这里是对指针求sizeof,
// 而指针变量是int的整型变量。在vc++ 6.0中int类型变量占4字节,所以 n肯定是4
printf("%d/n",n);
}
int fun2(int a[],int n) //形参中可以不指定一维数组的大小。
{
int sum=0;
for(int i=0;i<n;i++)
sum=sum+a[i];
return sum;
}
int main()
{
int b[2][3] = {{1,2,3},{4,5,6}};
int a[3]={1,2,3};
int num=0;
int num2=0;
int i=2;
int *p=&i;
num=fun(&b[0],2); //ok
// num =fun(b,2); //ok
// num=fun(&b[0][0],2); // error C2664: 'fun' : cannot convert parameter 1 from 'int *' to 'int [][3]'
// num=fun(&b,2); // error C2664: 'fun' : cannot convert parameter 1 from 'int (*)[2][3]' to 'int [][3]'
// num=fun(b[0],2); // error C2664: 'fun' : cannot convert parameter 1 from 'int [3]' to 'int [][3]'
num2=fun2(&a[0],3); // ok
// num2=fun2(a,3); //ok
// printf("%d/n",num2);
// printf("%d %d %d %d %d %d/n",b[0],&b[0],b[0][0],&b[0][0],b,&b); //只有b[0][0]是数组元素,其他均为地址
// 结果: 1245032 1245032 1 1245032 1245032 1245032
// 结论:虽然 b[0],&b[0],&b[0][0],b,&b 的值都相同,但是它们所代表(指向)的类型可能就不一样,其中&b[0]和b所指
// 向的类型是相同的,b[0]和&b[0][0]的类型可以是认为是相当(注意是相当,不是相同)。
// C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针,
// 当N维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素(这里的首元素是个N-1维数组)首地址的指针,
// printf( "%d/n ",num);
// printf("%d %d %d/n",sizeof(*p),sizeof(p),sizeof(b)); // sizeof(b)是求数组里所有元素所占的内存总和
// printf("%d %d %d %d/n",*p,p,sizeof(&b[0]),sizeof(b[0]));
// sizeof(&b[0])是对指针,即数组b的第一个元素(当然它是个长度是3的一维数组)的地址作用
// sizeof(b[0])是对数组b的第一个元素(当然它是个长度是3的一维数组)的作用,相当于求长度是3的一维数组所有
// 元素所占内存和
// 结果:2 1245008 4 12 //其中1245008是p的值,即*p的地址
// fun1(a); //ok
// fun1(&a[0]);//ok
// fun1(&a);// error C2664: 'fun1' : cannot convert parameter 1 from 'int (*)[3]' to 'int []'
// printf("%d/n",sizeof(a));
return 0;
}
//*****************************************************************************
//二维数组的引用作形参时,注意事项。看例子
#include<iostream>
using namespace std;
int fun(int (&a)[2][3]) //ok,引用作形参,数组作引用形参,必须指定清楚所有维数
// int fun(int (&a)[ ][3],int n) //error C2265: '<Unknown>' : reference to a zero-sized array is illegal
// int fun(int &a[2][3]) // error C2234: '<Unknown>' : arrays of references are illegal
{
int sum=0;
for (int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
sum=sum+a[i][j];
}
return sum;
}
int main()
{
int b[2][3] = {{1,2,3},{4,5,6}};
int num=0;
num=fun(b);
printf("%d/n",num);
return 0;
}
相关文章推荐
- C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
- 【C++再学习】【03】函数形参实参与值传递引用传递新解
- C/C++函数形参传实参时值传递、指针传递、引用传递的区别
- C/C++ 中函数形参传递二维数组的方法
- C++ 函数使用形参传入二维数组实参的方法
- C/C++函数形参传实参时值传递、指针传递、引用传递的区别
- C++ 函数参数传递-vector和其它容器类型的形参
- C++ 二维数组作为函数返回值类型传递方式举例
- C++语法基础--模板实参推断,模板类型形参的实参的受限转换,模板实参推断与函数指针
- 如果改变了形参数组的值 从而在调用函数期间 形参数组就和实参数组共占同一段内存单元 为什么形参数组从实参数组那里得到起始地址后 请问各位C语言高手:当用数组名作函数参数时 也就该变了实参数组的值
- C++向函数模版传递 const类型,数组类型
- 函数实参和形参之间的传递
- Python中函数的定义以及形参实参小结
- C/C++函数如何传递二维数组
- 【代码】结构体做函数参数,实现形参向实参传递值
- 第二周项目1 C/C++语言中的函数参数传递的三种方式--引用作形参
- 函数中实参到形参的传递
- C/C++二维数组作为函数参数传递
- 关于二维数组做函数参数,传递形参的形式的问题
- 函数调用时,需注意实参和形参的类型差异,类型内存存储格式的差异