`
jgsj
  • 浏览: 962733 次
文章分类
社区版块
存档分类
最新评论

C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结

 
阅读更多

转自: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
// i
nt 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++ 函数调用与函数返回值

     当参数表为空时,表示该函数不从调用函数接受数据。  2、数值参数  传值调用:形参只有在函数被调用时,才被分配内存区域,并一直保留到函数返回时被撤销为止。形参和实参只是名字相同,各自占有各自的内存...

    c++将数组名作为函数参数对数组元素进行相应的运算

    (1)用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的。因此,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按...

    老生常谈C++中实参形参的传递问题

    这里说的传递当然是指 实参是如何传递给形参的啦 还挺复杂的~~~~~~~~⊙﹏⊙b汗,这里讲述了4种参数传递的情况和注意事项: 1.非引用形参 这是最普通,也是最简单的形参传递了。 参数传递,即是使用实参副本(注意啊...

    Python 变量的引用-调用函数传递实参的引用

    Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器...

    c++指针使用形参改变实参的方法

    将10个整数按由小到大的顺序排列 #include using namespace std; int main() { //使用形参改变实参数 //将10个整数按由小到大的顺序排列 void select_sort(int *p, int n);... //函数调用,数组名作

    C++形参与实参的区别实例解析

    本文以实例阐述了C++中形参与实参的区别,有助于读者加深对于C++形参与实参的认识。 形参出现在函数定义中,在整个函数体内...2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它

    EDA/PLD中的C/C++ 函数调用与函数返回值

     当参数表为空时,表示该函数不从调用函数接受数据。  2、数值参数  传值调用:形参只有在函数被调用时,才被分配内存区域,并一直保留到函数返回时被撤销为止。形参和实参只是名字相同,各自占有各自的内存...

    C/C++中关于局部函数中更新实参指针的方法

    在C语言中因为参数的传递方式属于值传递,局部参数在函数内部的改变并不会影响实参的值,有时候为了保存对在函数中的修改,往往采用返回值或者指向指针的指针的形式来实现,我就采用简单的内存分配来说明。...

    c/c++ 学习总结 初学者必备

    而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对形参的改变并不影响实参的值。 22、数据结构和算法: A:查找: (1)二分法查找; B:写出下列算法的时间复杂度和实现排序: (1)...

    C程序设计(第四版)学习辅导【谭浩强】

    7.7.1数组元素作函数实参193 7.7.2数组名作函数参数195 7.7.3多维数组名作函数参数198 7.8局部变量和全局变量200 7.8.1局部变量200 7.8.2全局变量201 7.9变量的存储方式和生存期205 7.9.1动态存储方式与静态存储方式...

    C程序设计 第四版 谭浩强 高清扫描版 带完整书签目录 加 学习辅导

    7.7.1 数组元素作函数实参 7.7.2 数组名作函数参数 7.7.3 多维数组名作函数参数 7.8 局部变量和全局变量 7.8.1 局部变量 7.8.2 全局变量 7.9 变量的存储方式和生存期 7.9.1 动态存储方式与静态存储方式 7.9.2 局部...

    C++——有默认参数的函数.txt

    函数调用时形参从实参那里取值,so实参与形参一致,有时多次调用同一函数用同样的实参,可以直接给形参一个默认的值,这样形参不必从实参取值; 举例: 函数声明 float area(float r=6.5)//就是制定r的默认值是6.5...

    [Visual.C++.2010入门经典(第5版)].Ivor.Horton.part1

    5.2.8 接受数量不定的函数实参 229 5.3 从函数返回值 231 5.3.1 返回指针 231 5.3.2 返回引用 233 5.3.3 函数中的静态变量 236 5.4 递归函数调用 238 5.5 c++/cli编程 240 5.5.1 接受数量可变实参的函数 241 5.5.2 ...

    C++中模板类型的类型形参与实参的转换

    在用实参调用模板函数的时候,一般不会转换实参以匹配已有的实例化,而是会通过模板函数产生新的实例以适应该实参...  即便有了函数compare(int ,int),在用short类型的数据调用函数compare时,也不会将short类型转换

    经典C/C++面试题目大汇总(全附答案).doc

    而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率...

    C++语言程序设计自测练习

    若用数组名作为函数调用的实参,传递给形参的是( )。 A. 数组的首地址 B. 数组中第一个元素的值 C. 数组全部元素的值 D. 数组元素的个数 4. 以下错误的描述是( )。 A. 被调用函数中可以不用return语句 B. ...

    C++中函数的用法小结

    我们将函数定义或声明里的参数叫形参,而在调用函数时传入的参数叫实参。那么根据形参类型的不同,有几下形式的参数传递。 1,非引用形参 1)普通的内置类型 普通非引用类型的参数通过复制对应的实参实现形参的初始...

    新概念C语言.李一波(带详细书签).pdf

    11.4.1 形参为指针变量时,实参和形参之间的数据传递 95 11.4.2 通过传送地址值,在被调用函数中直接改变调用函数中变量的值 96 11.4.3 函数返回地址值 97 11.5 动态存储分配 98 11.6 链表的建立及基本操作 100...

    C++ Primer第四版【中文高清扫描版】.pdf

    7.2.5 传递给函数的数组的处理 209 7.2.6 main:处理命令行选项 210 7.2.7 含有可变形参的函数 211 7.3 return语句 211 7.3.1 没有返回值的函数 212 7.3.2 具有返回值的函数 212 7.3.3 递归 216 7.4 函数声明 217 ...

    C++的那些事:函数全解析

    我们将函数定义或声明里的参数叫形参,而在调用函数时传入的参数叫实参。那么根据形参类型的不同,有几下形式的参数传递。1)普通的内置类型普通非引用类型的参数通过复制对应的实参实现形参的初始化。当用实参的...

Global site tag (gtag.js) - Google Analytics