Tag: 指针

什么时候是一个整数< – >指针转换实际上是正确的?

民间传说说: types系统存在的原因。 整数和指针是不同的types,在大多数情况下铸造它们是一种弊端,可能表明devise错误,应该避免。 即使在执行这样的转换时,也不会对整数和指针的大小进行假设(将void*为int是使代码在x64上失败的最简单方法),而不是int应该使用intptr_t或uintptr_t stdint.h 。 知道什么时候执行这样的演员实际上是有用的 ? (注意:对可移植性的代价稍微短一点的代码并不算“实际上有用”)。 我知道的一个例子是: 一些无锁多处理器algorithm利用了2 + -byte-alligned指针有一些冗余的事实。 然后,他们使用指针的最低位作为布尔标志,例如。 使用具有适当指令集的处理器,这可以消除对locking机制的需要(如果指针和布尔标志是分离的,则这是必要的)。 (注意:这种做法甚至可以通过java.util.concurrent.atomic.AtomicMarkableReference在Java中安全地执行) 更多的东西?

“int * nums = {5,2,1,4}”导致分段错误

int *nums = {5, 2, 1, 4}; printf("%d\n", nums[0]); 导致段错误,而 int nums[] = {5, 2, 1, 4}; printf("%d\n", nums[0]); 没有。 现在: int *nums = {5, 2, 1, 4}; printf("%d\n", nums); 打印5。 基于此,我猜想数组初始化符号{}会盲目地将这些数据加载到左侧的任何variables中。 当它是int []时,数组按要求填充。 当它是int *时,指针被填充5,并且存储指针后的存储位置由2,1和4填充。因此,nums [0]尝试deref 5,导致段错误。 如果我错了,请纠正我。 如果我是正确的,请详细说明,因为我不明白为什么数组初始化符以他们的方式工作。

“dword ptr”是什么意思?

有人可以解释这是什么意思? (Intel语法,x86,Windows) and dword ptr [ebp-4], 0

P :: ************在Boost assert.hpp文件中是什么意思?

在boost / mpl / assert.hpp中 ,我看到如下所示: template<class Pred> struct eval_assert { typedef typename extract_assert_pred<Pred>::type P; typedef typename P::type p_type; typedef typename ::boost::mpl::if_c<p_type::value, AUX778076_ASSERT_ARG(assert<false>), failed ************ P::************ >::type type; }; 如果第一个************可以作为struct的指针处理失败,那么P::************对我来说真的没有任何意义。 这是标准的C ++吗?

是否有可能将C指针初始化为NULL?

我一直在写东西 char *x=NULL; 假设 char *x=2; 会创build一个char指针到地址2。 但是,在GNU C编程教程中,它说int *my_int_ptr = 2; 将整数值2存储到分配给my_int_ptr任何随机地址中。 这似乎意味着我自己的char *x=NULL是分配任何值的NULL强制转换为char是内存中的某个随机地址。 而 #include <stdlib.h> #include <stdio.h> int main() { char *x=NULL; if (x==NULL) printf("is NULL\n"); return EXIT_SUCCESS; } 事实上,打印 一片空白 当我编译和运行它时,我担心的是我依赖于未定义的行为,或者至less是不明确的行为,而且我应该写 char *x; x=NULL; 代替。

“int * ptr = int()”的值初始化是不是非法的?

下面的代码(取自这里 ): int* ptr = int(); 在Visual C ++中编译并初始化指针。 这怎么可能? 我的意思是int()产生一个inttypes的对象,我不能指定一个int指针。 上面的代码是不是非法的?

在C ++中传递指针

据我所知,没有理由不允许在C ++中传递对指针的引用。 但是,我这样做的尝试是失败的,我不知道为什么。 这就是我正在做的事情: void myfunc(string*& val) { // Do stuff to the string pointer } // sometime later { // … string s; myfunc(&s); // … } 我得到这个错误: 不能将参数1从“std :: string *”转换为“std :: string *&'

int(*)(int *)= 5(或任何整数值)的含义

我无法弄清楚这一点: int main() { int (*) (int *) = 5; return 0; } 上面的任务用g ++ c ++ 11编译。 我知道int (*) (int *)是一个函数的指针,它接受一个(int *)作为参数,并返回一个int,但我不明白你怎么可以将它等于5.起初我以为它是一个不断返回5的函数(从我最近学习的F#中,可能是哈哈),然后我简单地想,函数指针指向内存位置5,但是这不起作用,很明显,也不是hex值。 认为这可能是因为该函数返回一个int,并分配一个int是好的(不知何故),我也试过这个: int * (*) (int *) = my_ptr 其中my_ptr的types为int * ,与第二个函数指针的types相同,如第一种情况下的types为int。 这不会编译。 赋值5或者任何int值,而不是my_ptr ,也不会为这个函数指针编译。 那么这个任务是什么意思? 更新1 我们已经确认这是一个错误,如最佳答案所示。 但是,我们仍然不知道实际发生的情况是您分配给函数指针的值是什么,或者赋值时发生了什么。 任何(好)的解释,将非常感激! 请参阅下面的编辑,以更清楚地了解这个问题。 编辑1 我使用的是gcc版本4.8.2(在Ubuntu 4.8.2中) 编辑2 其实,把它等同于我的编译器。 即使将它等同于一个std :: stringvariables,或者返回一个double的函数名也是可行的。 编辑2.1 有趣的是,把它作为函数指针指向任何返回不是指针的数据types的函数,都会让它编译,比如 std::string (*) […]

指针,智能指针或共享指针?

我正在用普通的指针进行编程,但是我听说过像Boost这样的实现智能指针的库。 我也看到,在Ogre3D渲染引擎中有一个共享指针的深度使用。 这三者之间究竟有什么区别,我应该坚持只使用它们的一种?

可以指向基点指向派生对象的数组?

我今天去面试了,给了这个有趣的问题。 除了内存泄漏和事实没有虚拟Dtor,为什么这个代码崩溃? #include <iostream> //besides the obvious mem leak, why does this code crash? class Shape { public: virtual void draw() const = 0; }; class Circle : public Shape { public: virtual void draw() const { } int radius; }; class Rectangle : public Shape { public: virtual void draw() const { } int […]