C语言的动态分配函数
malloc(m):开辟m字节长度的地址空间,并返回这段空间的首地址
sizeof(x):计算变量x的长度
free(p):释放指针p所指变量的存储空间,即彻底删除一个变量
C++的动态存储分配
new 类型名T(初值列表)
功能:申请用于存放T类型对象的内存
int *p1=new int;
或 int *p1=new int(10);
结果值:
成功:T类型的指针,指向新分配的内存
失败:0(NULL)
delete 指针p
功能:释放指针P所指向的内存。P必须是new操作的返回值
C++中的参数传递
函数调用时传送给形参表的实参必须与形参在类型、个数、顺序上保持一致
参数传递有两种方式
- 传值方式(参数为整型、实型、字符型等)
- 传地址
- 参数为指针变量
- 参数为引用类型
- 参数为数组名
传值方式
- 把实参的值传递给函数局部工作区相应的副本中,函数使用
-
这个副本执行必要的功能。函数修改的是副本的值,实参的值不变
void swap(float m,float n)
{
float temp;
temp=m;
m=n;
n=temp;
}
传地址方式—指针变量作为参数
void swap1(float *m,float *n)
{
//形参变化影响实参
float t;
t=*m;
*m=*n;
*n=t;
}
传地址方式—指针变量作参数
void swap2(float *m,float *n)
{
//形参变化不影响实参,只改变两个值的地址,值并没有变
float *t;
cout<<n<<m<<endl;
t=m;
m=n;
n=t;
cout<<n<<m<<endl;
}
传地址方式—引用类型作参数
void swap3(float &m,float &n)
{
float temp;
temp=m;
m=n;
n=temp;
}
// 主函数main()
int main(int argc, const char * argv[]) {
float a,b;
cin>>a>>b;
swap(a,b);
float a,b,*p1,*p2;
cin>>a>>b;
p1=&a;p2=&b;
swap1(p1, p2);
float a,b,*p1,*p2;
cin>>a>>b;
p1=&a; p2=&b;
swap2(p1,p2);
cout<<a<<endl<<b<<endl;
// 引用:它用来给一个对象提供一个替代的名字
float a,b;
cin>>a>>b;
swap3(a, b);
cout<<a<<endl<<b<<endl;
return 0;
}
传地址方式—-数组名作参数
- 传递的是数组的首地址
-
对形参数组所做的任何改变都将反映到实参数组中
#include <iostream> using namespace std; void sub(char b[]); int main(int argc, const char * argv[]) { char a[10]="hello"; sub(a); cout<<a<<endl; return 0; } void sub(char b[]) { for (int i=0;i<9;i++) { b[i]='d'; } }
引用类型作参数的三点说明
传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。
引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。
- 指针参数虽然也能达到与使用引用的效果,但在被强调函数中需要重复使用“ *指针变量名”的形式进行运算,这很容易产生错误和程序的阅读性较差;另一方面,在主调函数的调用处,必须用 变量的地址作为实参。