'Cython: Assign pointer values, not the pointer itself

C/C++ allows assigning values of a pointer to another pointer of the same type:

#include <iostream>

using namespace std;

int main() {
    int* a = new int();
    int* b = new int();

    *a = 999;
    *b = *a; // Can't do in Cython this?

    cout <<"Different pointers, same value:" <<endl;
    cout <<a <<" " <<b <<endl;
    cout <<*a <<" " <<*b <<endl;
} 

Is it possible to write the line *b = *a above in Cython?

All these fail:

from cython.operator cimport dereference as deref

cdef cppclass foo: # Can't `new int()` in Cython, make a class
    int value 

cdef foo* a = new foo()
cdef foo* b = new foo()

a.value = 999
deref(b) = deref(a) # Error: Cannot assign to or delete this
b        = deref(a) # Error: Cannot assign type 'foo' to 'foo *'
deref(b) = a        # Error: Cannot assign to or delete this
b        = a        # Works, but pointer 'b' is gone!!! not a clone.


Solution 1:[1]

Using b[0] = a[0] seems to do the trick. Indexing is another way to dereference the pointer. Here's some example code and its output.

# distutils: language=c++


cdef cppclass foo:
    int value 

cdef foo* a = new foo()
cdef foo* b = new foo()

a.value = 999
b.value = 777

print('initial values', a.value, b.value)
print('initial pointers', <long>a, <long>b)

b[0] = a[0]

print('final pointers', <long>a, <long>b)
print('final values', a.value, b.value)

As you can see, the values of b have changed, but the pointer still references the same address as before.

initial values 999 777
initial pointers 105553136305600 105553136304304
final pointers 105553136305600 105553136304304
final values 999 999

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Till Hoffmann