[c++基础] 函数参数传递,数组

1. C++中函数参数传递

从概念上来说一下这几种函数传参方式及区别:

(1)值传递:形参是实参的拷贝,改变函数形参的值并不会影响外部实参的值,,返回值那是return考虑的;

(2)指针传递:指针传递参数从本质上来说也是值传递,它传递的是一个地址。【值传递过程中,被调函数的形参作为被调函数的局部变量来处理,即在函数内的栈中开辟内存空间以存放由主调函数放进来的实参的值,从而成了实参的一个副本(记住这个,函数内参数是实参的副本)】。由于指针传递的是外部实参的地址,当被调函数的形参值发生改变时,自然外部实参值也发生改变。

void swap(int *a,int *b)

{

   int temp;

   temp=*a;

   *a=*b;

   *b=temp;

}

调用:swap(&x,&y); 



3、引用传递:被调函数的形参虽然也作为局部变量在栈中开辟了内存空间,但是栈中存放的是由主调函数放进的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中实参变量(实参和形参通过引用,合二为一,说白点就是:一个人有两个名字那种)。因此,形参的任何改动都会直接影响到实参。

void swap(int &a,int &b)

{

   int temp;

   temp=a;

   a=b;

   b=temp;

}

调用:swap(x,y); 



2. 函数参数传递&指针相关的典例

1. 

  


解析:

答案D,函数里的形参s只是实参p的一个复制,s=a改变了s的内容(如果在fun里面输出s,结果是STRING),但并没改变p的值,更没有改变其指向的内容


2.


输出结果:


解析:

前两个是字符数组,定义在栈上,明显地址不同
字符串常量定义在静态区,仅有一份拷贝,所以后面两个指针指向的地址相同


3.

解析:
输出:result is to test something
开始p指向“ glad to test something”中的g,然后p++,指向l
int *p1 = reinterpret_cast<int*>(p); 把p赋值给int型了, p1++,即加了4个字节位置。即p1指向“glad to test something”中的t
p = reinterpret_cast<char *>(p1); 把p1的转回了p,p指向了“ glad to test something”中的t
输出to test something

4.


解析:
B应该也是错误的,由于[]的优先级高于*,因此,相当于对地址(X+ii)[j]取值,如果B改为(*(X+ii))[j]就对了


4.
  
解析: acX , acY 是2个数组,属于变量,一般存在栈区,可以修改, szX , szY 是2个指针指向常量区,常量区的东西不能被修改,所以D是错误的


3. 数组

二维数组必须指定列的数量,行的数量可以不指定,二维数组的初始化方式有以下几种:
⑴ 分行进行初始化 
 int a[2][3]={{1,2,3},{4,5,6}}; 
 ⑵ 不分行的初始化 
 int a[2][3]={ 1,2,3,4,5,6}; 
⑶ 为部分数组元素初始化 
 static int a[2][3]={{1,2},{4}}; 
第一行只有2个初值,按顺序分别赋给a[0][0]和a[0][1];第二行的初值4赋给a[1][0]。由于存储类型是static,故其它数组元素的初值为0。  
 ⑷ 可以省略第一维的定义,但不能省略第二维的定义。系统根据初始化的数据个数和第2维的长度可以确定第一维的长度。 
 int a[ ][3]={ 1,2,3,4,5,6}; 
 a数组的第一维的定义被省略,初始化数据共6个,第二维的长度为3,即每行3个数,所以a数组的第一维是2。 
 一般,省略第一维的定义时,第一维的大小按如下规则确定: 
初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1。例如,int a[ ][3]={ 1,2,3,4};等价于:int a[2][3]={ 1,2,3,4}; 
 若分行初始化,也可以省略第一维的定义。下列的数组定义中有两对{ },已经表示a数组有两行。 
 static int a[ ][3]={{1,2},{4}};


二维动态数组的申请和删除:

首先是如何申请二维的数组,这里我们先申请一个指针数组,然后令指针数组中的每一个元素都指向一个数组:

int **MathTable =newint*[row];

for (int i =0; i < row; i++)  MathTable[i] =newint[col];

 

释放空间:

for (int i =0; i < row;i++)delete[] MathTable[i];

delete[]MathTable;










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值