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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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所指向的内存。

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;
}
AI 代码解读

传地址方式—指针变量作参数

void swap2(float *m,float *n)
{
   //形参变化不影响实参,只改变两个值的地址,值并没有变
    float *t;

    cout<<n<<m<<endl;
    t=m;

    m=n;
    n=t;
    cout<<n<<m<<endl;
}
AI 代码解读

传地址方式—引用类型作参数

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;
}       
AI 代码解读

传地址方式—-数组名作参数

  • 传递的是数组的首地址
  • 对形参数组所做的任何改变都将反映到实参数组中

     #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';
    }
    }
    
    AI 代码解读

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

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

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

  • 指针参数虽然也能达到与使用引用的效果,但在被强调函数中需要重复使用“ *指针变量名”的形式进行运算,这很容易产生错误和程序的阅读性较差;另一方面,在主调函数的调用处,必须用 变量的地址作为实参
相关文章
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
1月前
|
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
118 6
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
121 1
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
160 1
|
4月前
|
【C语言】断言函数 -《深入解析C语言调试利器 !》
断言(assert)是一种调试工具,用于在程序运行时检查某些条件是否成立。如果条件不成立,断言会触发错误,并通常会终止程序的执行。断言有助于在开发和测试阶段捕捉逻辑错误。
97 5
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
41 12
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
50 16

热门文章

最新文章

推荐镜像

更多