¿Qué es el puntero en lenguaje C?


prefacio

Si bien los punteros simplifican el desempeño de algunas tareas de programación en C, otras, como la asignación de memoria dinámica, no se pueden realizar sin punteros.
Por lo tanto, si quieres convertirte en un excelente programador de C, es necesario aprender punteros.


1. ¿Qué es un puntero?

Un puntero es una variable que almacena una dirección de memoria.
Esta dirección de memoria apunta a la ubicación de otra variable, lo que permite que el programa acceda y manipule el valor de esa variable.

Cada variable tiene una dirección de memoria, y la dirección de memoria es 可用 & 运算符取到内存地址.

Las declaraciones de puntero usan el símbolo *

// p 是一个指针变量,它存储了一个地址
// *p 是指针 p 所指向的地址上存储的值
int *p;

En esta declaración, la variable p es un puntero de tipo entero. Puede usar el símbolo & para obtener la dirección de una variable.

int n = 10;
int *p = &n;

En esta declaración, &n obtiene la dirección de la variable n y asigna la dirección al puntero p. A través del puntero p se puede acceder y modificar el valor de la variable n.

*p = 20;
printf("%d", n); // 输出20

*En esta declaración, p representa el valor almacenado en la dirección de memoria a la que apunta el puntero p. Después de asignar *p con un valor de 20, el valor de la variable n también se cambia a 20.
inserte la descripción de la imagen aquí

En segundo lugar, ¿cómo usar el puntero?

Defina una variable puntero,
asigne la dirección de la variable al puntero,
acceda al valor de la dirección disponible en la variable puntero.
Estos se devuelven utilizando el operador unario * para devolver el valor de la variable en la dirección especificada por el operando.

1. Operaciones aritméticas con punteros

  • Cada vez que el puntero 递增apunta a 下一个la unidad de almacenamiento del elemento.
  • Cada vez que el puntero 递减apunta a 前一个la unidad de almacenamiento del elemento.
  • El número de bytes que salta el puntero al incrementar y decrementar depende de 指针变量数据类型长度, por ejemplo, un int es 4 bytes.

incrementar un puntero

#include <stdio.h>

const int MAX = 3;

int main ()
{
    
    
   int  var[] = {
    
    10, 100, 200};
   int  i, *ptr;
   /* 指针中的数组地址 */
   ptr = var;
   for ( i = 0; i < MAX; i++)
   {
    
    
      printf("存储地址:var[%d] = %p\n", i, ptr );
      printf("存储值:var[%d] = %d\n", i, *ptr );
      /* 指向下一个位置 */
      ptr++;
   }
   return 0;
}
// 存储地址:var[0] = e4a298cc
// 存储值:var[0] = 10
// 存储地址:var[1] = e4a298d0
// 存储值:var[1] = 100
// 存储地址:var[2] = e4a298d4
// 存储值:var[2] = 200

Comparación de punteros
Siempre que la dirección a la que apunta el puntero de variable sea menor o igual que la dirección &var[MAX - 1] del último elemento de la matriz, el puntero de variable se incrementa.

#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
    
    
   int  var[] = {
    
    10, 100, 200};
   int  i, *ptr;
 
   /* 指针中第一个元素的地址*/
   ptr = &var;
   i = 0;
   while ( ptr <= &var[MAX - 1] )
   {
    
    
      printf("存储地址:var[%d] = %p\n", i, ptr );
      printf("存储值:var[%d] = %d\n", i, *ptr );
 
      /* 指向下一个位置 */
      ptr++;
      i++;
   }
   return 0;
}

2. Matriz de punteros

ptr se declara como una matriz que consta de punteros enteros MAX.
Por lo tanto, cada elemento de ptr es un puntero a un valor int.

int *ptr[MAX];

El siguiente ejemplo utiliza tres números enteros, que se almacenarán en una matriz de punteros, de la siguiente manera:

#include <stdio.h>
 
const int MAX = 3;
 
int main ()
{
    
    
   int  var[] = {
    
    10, 100, 200};
   int i, *ptr[MAX];
 
   for ( i = 0; i < MAX; i++)
   {
    
    
      ptr[i] = &var[i]; /* 赋值为整数的地址 */
   }
   return 0;
}

3. Puntero a puntero

Un puntero a un puntero es una forma de direccionamiento indirecto de varios niveles. Cuando definimos un puntero a puntero, el primer puntero contiene la dirección del segundo puntero, que apunta a la ubicación que contiene el valor real.
Puntero a puntero de tipo int:

int a = 100;
int *p1 = &a;
int **p2 = &p1;

inserte la descripción de la imagen aquí
El lenguaje C no limita el número de niveles de punteros, por cada nivel adicional de punteros, se debe agregar un asterisco * al definir variables de puntero.
p1 es un puntero de primer nivel, que apunta a datos de tipo común, con un * cuando se define;
p2 es un puntero de segundo nivel, que apunta al puntero de primer nivel p1, con dos * cuando se define.

4. Pase el puntero a la función

#include <stdio.h>

void increment(int *ptr) {
    
    
    (*ptr)++;
}

int main() {
    
    
    int num = 5;
    printf("Before increment: %d\n", num);
    increment(&num);
    printf("After increment: %d\n", num);
    return 0;
}

5. Devuelve el puntero de la función

// todo

Supongo que te gusta

Origin blog.csdn.net/weixin_42465316/article/details/129753765
Recomendado
Clasificación