栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C/C++语言中的几个区别

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C/C++语言中的几个区别

目录
  • 指针和引用的区别
    • 语义语法规则
    • 从汇编层次理解
  • define 和 inline 的区别
    • 替换时间
    • define 具有副作用
  • 为什么c++可以重载而c不行
    • C++语言的函数名粉碎规则
    • c函数名字粉碎规则
  • 左值、右值、右值引用
  • C++中的new 、delete 与 C语言中的malloc、free有什么区别
  • C11的新特性

指针和引用的区别 语义语法规则
  1. (语法方面)指针:存储某个实例(变量或对象)的地址;引用:某个实例的别名;
  2. (内存方面) 程序为指针变量分配内存区域;而不为引用分配内存区域。
  3. 指针变量的值可以发生改变,引用在定义时初始化,之后无法改变
  4. 指针变量的值可以为空,而没有空引用,因此,在使用指针时要判空,使用引用时不用判空
  5. 指针有多级指针,而引用没有多级引用
从汇编层次理解
  • 源码
int main(){
    int a = 10;
    int* ip =  &a;
    int& b = a;
    *ip = 100;
    b =  200;
    return 0;
}
  • 汇编

    从汇编代码上可以看出引用和指针在汇编层次是一样的
    可以理解为:
int fun(int& x){    ->int fun(int* const x){
	int* ip = 100;  ->   int *ip = 100;
	x = *ip;        ->   *x = 100;
	}               
int main(){
    int a = 10;
    int* ip =  &a;
    int& b = a; ->int *const b = &b;
    *ip = 100;
    b =  200;
    return 0;
}
define 和 inline 的区别 替换时间

define 是在预编译阶段进行替换,inline是在编译和链接阶段进行

define 具有副作用

define 具有副作用只是根据字符串进行简单的替换,应此会具有副作用,同时不会进行类型的检查

为什么c++可以重载而c不行
  • 根本的原因是:c++的函数名粉碎规则较为彻底,也就是说编译之后函数名相同但参数列表不同的函数的标志名是不同的,因此编译器可以据此进行对同名函数的区分;
C++语言的函数名粉碎规则

__cdecl 调用约定

  1. 以?号标识函数名的开始,后跟函数名
  2. 函数名后面跟@@YA标识参数标的开始,后跟参数表
  3. 参数表的代号表示:

X - void
D - char
H - int
J - long
M - float
_N - bool …
PA - 表示指针后面的代号表示类型

  1. 参数表的第一项为该函数的返回值
  2. 参数表以@Z结束,无参数则Z标识结束
c函数名字粉碎规则
  • 在函数名前加_

c++的函数名字粉碎规则较为彻底,因此可以进行函数的重载

左值、右值、右值引用

左值:可以取地址,有名字的值
右值:无名的量
右值引用:int&& x = 10;(不是引用的引用)

C++中的new 、delete 与 C语言中的malloc、free有什么区别 C11的新特性
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/836077.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号