GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • pointers.py
  • Getting Started
  • Using Pointers
  • Variable Pointers
  • Allocation
  • C Bindings
  • CPython ABI Bindings
  • Working By Example
  • Reference

This view

  • Original page
  • New address

GeezerVison is showing pointers.zintensity.dev — Variable Pointers - pointers.py

Variable Pointers

What's the difference?

An object pointer (created by to_ptr or Pointer.make_from) points to the actual Python object (PyObject*), while a variable pointer points to that actual variable.

hello = "123"
ptr = to_ptr(hello)
# ptr now points to "123", not "hello"

Creation

You can make a variable pointer through to_var_ptr:

from pointers import to_var_ptr

a = "hi"
ptr = to_var_ptr(a)

Note that of course you can't use a literal, because that isn't a variable:

from pointers import to_var_ptr

ptr = to_var_ptr(123)  # ValueError

Movement

Moving is much different when it comes to variable pointers. With an object pointer, you are overwriting that actual value, while with variable pointers you are just changing the value of that variable.

You can use movement the same way you would with an object pointer:

from pointers import to_var_ptr

my_var = 1
my_ptr = to_var_ptr(my_var)
my_ptr <<= 2
print(my_var, 1)
# outputs 2 1, since we didnt overwrite 1 like we would with object pointers

You are free to use movement however you like with variable pointers. It isn't dangerous, unlike its counterpart.

For C/C++ developers

Movement in variable pointers is equivalent to the following C code:

int my_var = 1; // "my_var = 1"
int my_ptr = &my_var; // "my_ptr = to_var_ptr(my_var)"
*my_ptr = 2; // "my_ptr <<= 2"
// my_var is now 2 (the actual 1 is unchanged, thankfully)

Assignment

Assignment works the same way as it does with object pointers:

from pointers import to_var_ptr, NULL

hello = "world"
foo = "bar"

ptr = to_var_ptr(hello)
print(*ptr)  # world
ptr >>= NULL
# ...
ptr >>= foo
print(*ptr)  # bar
« Previous Next »
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.