1.9 KiB
| tags | |
|---|---|
|
A pointer is a reference to the address of a variable in memory.
int x = 27;
int *ptr = &x;
printf("%i\n", x);
// 27
printf("%p\n", *ptr);
// 0x7ffeb44f7eac
The & and * is frankly confusing.
In the previous example, int *ptr = &x, ptr is a variable that holds the
memory address of x. * signals that it is a pointer variable, & is what
does the retrieval.
In the following:
int x = 27;
int *ptr = &x;
int value = *ptr;
We again set ptr to the memory address of x, but we use * on the last line
to de-reference the pointer and get the original value back. Thus value
becomes equal to 27.
Pointers are necessary because C uses a call by value system for function arguments.
To use a pointer you don't have to declare the value first (confusing)
It is totally legitimate to declare a pointer in one go, especially with strings:
char *name = "Thomas";
Then to reference the value (not the address, the actual value) you just use
name.
This is confusing but I just have to accept for now.
Note that if you do this, it creates the string in read-only memory. You can't
modify the individual characters of "Thomas". To do this you would need to
define it as:
char name[] = "Thomas";
name[0] = "t";
Here is a real example of me doing this:
void mqtt_publish(esp_mqtt_client_handle_t client, char *topic,
const char *payload)
{
if (MQTT_CONNECTED) {
esp_mqtt_client_publish(client, topic, payload, strlen(payload), 0, 0);
}
}
And then when calling the function:
mqtt_publish(mqtt_client, "test_topic", "Test message");
Or, using a variable:
static char *topic = "test_topic";
mqtt_publish(mqtt_client, topic, "Test message");
Note in the above the
*is part of the type definition, not the variable. Even more confusing!