Skip to content

[C] Introduction of Pointer

A pointer is a variable that contains the address of a variable. Generally speaking, when we declare and assign a variable to the system today, the program will apply for space in the memory to store :

  • Variable address (starting address)
  • Variable value
  • Variable name

Using indicators, we can declare a variable to point to the memory address of a specific variable (to get the address with the & symbol).

What are the advantages of doing this? Pointers actually have many advantages, for example:

  • Provide a method for passing in parameters for the function (for example, pass an array)
  • Reduce copying of large blocks of memory and reduce waste of resources
  • Support certain data structures (for example, Linked-List)

Of course, pointers are not without shortcomings, and sometimes the wrong way to use them can even cause the system to crash.


How to use Pointer

If you want to declare a pointer, you need to add the * symbol after the data type.

data-type *p;

And how to operate pointer variable? Let’s look at a short sample code:

#include <stdio.h>


// Main
int main() {
    int x=1, y=2, z[10];
    int *p;              // p is a pointer to int

    p = &x;              // p now points to x
    y = *p;              // y is now 1
    *p = 0;              // x is now 0
    p = &z[0];           // p is now points to z[0]

    return 0;
}



Pointer and function parameters

As mentioned earlier when explaining the advantages of the pointer, the pointer provides a method to pass in parameters for the function. What does it mean?

We design a function swap(x, y) to exchange of the values of two variables x and y.

Wrong way

#include <stdio.h>


void swap(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
}


// Main
int main() {
    int x=1, y=2;
    swap(x, y);

    printf("x: %d\ny: %d\n", x, y);

    return 0;
}


Output:

x: 1
y: 2

As you can see, the values of x and y are not exchanged at all. This is because when the values of x and y are passed into swap(x, y), another copy is made, and the variables that are not exchanged in swap(x, y) are the copied variables, which cannot really affect the variables passed in from outside. (Of course you can return the value of the exchanged variable, and then declare x and y again.)


Correct way

#include <stdio.h>


void swap(int *px, int *py) {
    int temp = *px;
    *px = *py;
    *py = temp;
}


// Main
int main() {
    int x=1, y=2;
    swap(&x, &y);

    printf("x: %d\ny: %d\n", x, y);

    return 0;
}


Output:

x: 2
y: 1

It can be seen that using the pointer operation is like operating the original variable exchange value.


Pointer and Array

After declaring an array, our variable memory address is the memory address of the first element. Take a look at the sample code (%p is the print memory address)

#include <stdio.h>


// Main
int main() {
    int a[3] = {1, 2, 3};

    printf("a:     %p\n", a);
    printf("&a[0]: %p\n", &a[0]);

    return 0;
}


Ouptut:

a:     0x7ffee0c7c47c
&a[0]: 0x7ffee0c7c47c

Are the memory addresses exactly the same?

In addition, the index of the array is the “displacement” of the memory address of the first element. As long as the memory address of the first element is obtained and assigned to the pointer variable, each time it is increased by one unit, the memory location will be the same as the memory location of different elements in the array.

#include <stdio.h>


// Main
int main() {
    int a[3] = {1, 2, 3};
    int *p = a;

    for (int i=0; i<sizeof(a)/sizeof(a[0]); ++i) {
        printf("p + %d: %p\n", i, p+i);
        printf("&a[%d]: %p\n", i, &a[i]);
        printf("===================================\n");
    }
    
    return 0;
}


Output:

p + 0: 0x7ffee102747c
&a[0]: 0x7ffee102747c
===================================
p + 1: 0x7ffee1027480
&a[1]: 0x7ffee1027480
===================================
p + 2: 0x7ffee1027484
&a[2]: 0x7ffee1027484
===================================

It is very easy to use pointer to get the values in the array:

#include <stdio.h>


// Main
int main() {
    int a[3] = {1, 2, 3};
    int *p = a;

    for (int i=0; i<sizeof(a)/sizeof(a[0]); ++i) {
        printf("*(p + %d): %d\n", i, *(p+i));
    }
    
    return 0;
}


Output:

*(p + 0): 1
*(p + 1): 2
*(p + 2): 3

Character Pointer

In C programming language, a string is actually characters stored in arrays. And in the last section I have recorded how to manipulate the array through the pointer.

When using pointer variable to store a string, the content of the string cannot be changed (it is possible to use a character array to store it). Therefore, it is recommended to add const when using pointer variable to store string.

#include <stdio.h>


// Main
int main() {
    const char *pText = "Hello";
    char text[] = "world";

    text[0] = 'W';
    printf("%s %s\n", pText, text);

    return 0;
}


Output:

Hello World

References


Read More

Leave a Reply