Tag: 指针

为什么在C和C ++中定义的NULL指针是不同的?

在C中, NULL被定义为(void *)0而在C ++中则为0 。 为什么这样? 在CI中可以理解,如果NULL不是types转换(void *)那么编译器可能会/不会生成警告。 除此之外,有什么理由吗?

在C ++中通过引用传递指针的原因?

在哪种情况下你会想在c ++中使用这种性质的代码? void foo(type *&in) {…} void fii() { type *choochoo; … foo(choochoo); }

比较悬挂指针是合法的吗?

比较悬挂指针是合法的吗? int *p, *q; { int a; p = &a; } { int b; q = &b; } std::cout << (p == q) << '\n'; 注意p和q如何指向已经消失的对象。 这是合法的吗?

打印一个指针包含在C中的地址

我想做一些看起来相当简单的事情。 我得到的结果,但问题是,我没有办法知道如果结果是正确的。 我在C工作,我有两个指针; 我想打印指针的内容。 我不想取消引用指针来获取指向的值,我只想要指针存储的地址。 我写了下面的代码,我需要知道的是,如果它是正确的,如果不是,我该如何纠正它。 /* item one is a parameter and it comes in as: const void* item1 */ const Emp* emp1 = (const Emp*) item1; printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 ); 虽然我发布这个(而这是重要的,这是正确的)是我最终需要做一个指针指针。 那是: const Emp** emp1 = (const Emp**) item1;

指针值是不同的,但他们比较相等。 为什么?

一个简短的例子输出一个奇怪的结果! #include <iostream> using namespace std; struct A { int a; }; struct B { int b; }; struct C : A, B { int c; }; int main() { C* c = new C; B* b = c; cout << "The address of b is 0x" << hex << b << endl; cout << […]

testing指针的有效性(C / C ++)

有什么方法可以确定(当然,编程方式)给定的指针是否“有效”? 检查NULL很容易,但是像0x00001234这样的事情呢? 当试图解引用这种types的指针时会发生exception/崩溃。 一个跨平台的方法是首选,但特定于平台(Windows和Linux)也是可以的。 澄清更新:问题不在陈旧/释放/未初始化的指针; 相反,我正在实现一个从调用方获取指针的API(如指向string的指针,文件句柄等)。 调用者可以发送(有意或无意)一个无效值作为指针。 我如何防止崩溃?

const的正确性是否给编译器更多的空间来优化?

我知道它提高了可读性,使得程序不易出错,但是提高性能有多less? 另外,注意,引用和const指针之间的主要区别是什么? 我会假设他们以不同的方式存储在内存中,但是如何呢? 谢谢。

const char *和char const * – 它们是一样的吗?

根据我的理解, const修饰符应该从右到左读。 从那里,我明白了: const char* 是一个指针,它的char元素不能被修改,但指针本身可以和 char const* 是一个mutable字符的常量指针。 但是我得到以下代码的错误: const char* x = new char[20]; x = new char[30]; //this works, as expected x[0] = 'a'; //gives an error as expected char const* y = new char[20]; y = new char[20]; //this works, although the pointer should be const (right?) y[0] = 'a'; //this […]

为什么不在C ++中使用指针?

假设我定义了一些类: class Pixel { public: Pixel(){ x=0; y=0;}; int x; int y; } 然后使用它编写一些代码。 我为什么要做下面的事情? Pixel p; px = 2; py = 5; 来自Java世界,我总是写: Pixel* p = new Pixel(); p->x = 2; p->y = 5; 他们基本上做同样的事情,对吧? 一个在栈上,另一个在堆上,所以我将不得不删除它。 两者有什么根本的区别? 为什么我应该比另一个更喜欢?

指针指向正常指针

指针的目的是保存特定variables的地址。 那么下面代码的内存结构应该是这样的: int a = 5; int *b = &a; ……内存地址……值 一个… 0x000002 ………………. 5 b … 0x000010 ………………. 0x000002 好的。 那么现在假设我想保存指针* b的地址。 那么我们通常定义一个双指针** c,as int a = 5; int *b = &a; int **c = &b; 然后内存结构如下所示: ……内存地址……值 一个… 0x000002 ………………. 5 b … 0x000010 ………………. 0x000002 c … 0x000020 ………………. 0x000010 所以** c引用* […]