Post

pointers

Источник https://proproprogs.ru/c_base/c_ukazateli-proshche-prostogo

Указатели

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main(void) 
{
         char d = 10;
         char *gpt;
         gpt = &d;
 
         printf("gpt = %p, *gpt = %d, d = %d\n", gpt, *gpt, d);
         
         *gpt = 100;
         printf("gpt = %p, *gpt = %d, d = %d\n", gpt, *gpt, d);
 
         return 0;
}

ещё

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main(void) 
{
         int arg = 7;
         int *ptr_arg, *ptr;
 
         ptr_arg = &arg;
         ptr = ptr_arg;
 
         printf("*ptr = %d, arg = %d\n", *ptr, arg);
 
         *ptr_arg = 100;
         printf("*ptr = %d, arg = %d\n", *ptr, arg);
 
         return 0;
}

и ещё

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main(void) 
{
         int g = 476789;
         char *ptr = (char *)&g;
 
         for(int i = 0;i < sizeof(g); ++i) {
                   printf("%d ", *ptr);
                   ptr++;
         }
 
         return 0;
}

char *ptr = (char *)&g;

Здесь объявляется указатель ptr на тип char, который инициализируется адресом переменной g. Это означает, что ptr теперь указывает на первый байт в памяти, где хранится значение переменной g.

int x = *ptr + 1;

Здесь происходит интересный момент. Значение переменной g имеет тип int и занимает несколько байтов в памяти. Но указатель ptr интерпретируется как указатель на char, что означает, что он будет читать данные из памяти по байтам. Таким образом, *ptr прочитает первый байт из переменной g, а затем к нему прибавится 1.

printf("x = %d\n", x);

Здесь значение x выводится на экран. Поскольку *ptr прочитал первый байт из переменной g, то x будет равно значению этого байта, увеличенному на 1.

swap_2 Поменять местами значения двух переменных

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void swap_2(int* a, int* b)
{
         int t = *a;
         *a = *b;
         *b = t;
}
 
int main(void) 
{
         int x = 5, y = 10;
         swap_2( &x, &y );
         
         return 0;
}
This post is licensed under CC BY 4.0 by the author.