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.
输出结果:
解析:
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;