C、C++动态分配函数暨几种参数传递疑难解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

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';
    }
    }
    

引用类型作参数的三点说明

  • 传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。

  • 引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。

  • 指针参数虽然也能达到与使用引用的效果,但在被强调函数中需要重复使用“ *指针变量名”的形式进行运算,这很容易产生错误和程序的阅读性较差;另一方面,在主调函数的调用处,必须用 变量的地址作为实参
目录
相关文章
|
20天前
|
自然语言处理 编译器 Linux
|
26天前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
1月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
47 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
25 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
24 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
178 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
43 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
5天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
27 5
|
11天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
40 4

推荐镜像

更多