C++:指针语法之间的差异
C++: Difference between pointer syntaxes
好吧,我最近一直在深入研究C++,我正在把一切都记下来。指针终于开始有意义了,我应该在什么时候使用它们,如何正确实现它们,等等。
然而,关于指针的基本使用,还有一个小问题需要回答。我直接跳到代码:
使用以下类A
和函数foo(A* bar)
class A
{}
void foo(A* bar)
{}
。。。以下对foo
的调用有什么区别
A* a;
A b;
foo(a);
foo(&b);
它们都编译得很好,据我记忆所及,我对它们没有任何问题。
我认为A b;
就在那里被实例化了,而A* a;
需要用new
来创建(因为它实际上还没有创建对象,所以它只是保存了一个4字节长的对潜在A
对象的引用)。
如果我想得正确,我可以执行a = b;
(EDIT使其成为a = &b
),然后成功地将a
传递给foo
。但是,如果我不执行a = &b
,而foo
尝试读取a
指向的(不存在的)对象,这将导致运行时错误。
此外,如果上面的内容是正确的,那么假设我可以很好地成功调用foo(&b);
。
我说得对吗?
谢谢!
foo(&b);
将类型为CCD_ 16的已存在对象的地址作为参数传递给函数CCD_。
foo(a);
传递指向类型CCD_ 18的指针作为函数参数。为了能够做任何有意义的事情,它必须指向一个有效的A
对象。可以通过两种方式完成:
正在堆栈上分配对象:
在堆栈(本地存储)上创建类型为CCD_ 20的对象&使指针a
指向这个对象:
A* a;
A b;
a = &b;
动态内存分配:
A *a = new A;
不过,一旦你进行了动态内存分配,你就必须记住在使用后明确释放分配的内存,否则你就会出现内存泄漏:
delete a;
请注意,最好尽可能避免动态分配,如果必须这样做,请使用智能指针而不是原始指针。
您不能执行a = b
。
必须是a = &b
,才能将a
设置为b
的地址。
关于内存管理,您也是正确的:b
在堆栈上分配,而a
只为指针分配空间,并将创建实际对象留给您。
foo(&b)
将工作文件,在初始化*a
之前(例如通过a = new A()
),foo(a)
的行为将是未定义的。
在C++中,指针是一类对象。指针不仅仅是一个需要关联对象才能具有标识的不可见引用。Java/C#引用就是这样工作的(或者说大多数其他语言),但指针本身就是一个对象。
因此A* a
声明了一个指针。它不指向任何东西,也没有指向任何东西。如果/当它指向某个东西时,它不需要拥有那个东西。
所以你不需要做a = new A()
。你也可以做a = &b
(让a
包含对象b
的地址。或者它也可以指向A
类型的任何其他对象。指针只是一个存储地址的对象。关键是你要放弃它"有一个对象"需要创建"的概念。
它是一个对象,它包含一个地址(或包含特殊值null),如果它包含地址,则该地址可能有也可能没有A
类型的对象。
你基本上是正确的。您不应该假设指针是4个字节(例如,在amd64系统上可能是8个)。此外,您的分配应该是a = &b;
(注意添加了地址运算符)。除此之外,这听起来很合理。
- 1d 智能指针不适用于语法 (*)++
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 助记符和指向成员语法的指针
- int(c) 和 c-'0' 之间的区别。C++
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 在cuda线程之间共享大量常量数据
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 这两种C++语法之间有什么区别?
- 如何避免语法相同的常量和非常量函数之间代码重复,这些函数在语义上不相同
- C++ 中不同指针语法之间的语义差异
- Const引用Visual Studio和GCC之间的语法差异
- C++类和结构之间交互的语法
- 我正在制作语法高亮笔,但在引号之间为文本着色时遇到问题
- 基元类型初始化的构造函数语法和赋值语法之间的差异
- C++:指针语法之间的差异
- 为什么显式专业化和部分专业化之间的语法差异
- 编译后停止和仅检查语法之间的区别
- 调用方法的这三种语法形式之间有什么区别?