Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Punteros C

Puntero C

En este tutorial, aprenderá acerca de los punteros; qué son los punteros, cómo los usa y los errores comunes que puede encontrar al trabajar con ellos con la ayuda de ejemplos.

Los punteros son características poderosas de la programación en C y C++. Antes de aprender punteros, aprendamos acerca de las direcciones en la programación C.


Dirección en C

Si tiene una variable var en su programa, &var le dará su dirección en la memoria.

Hemos usado la dirección varias veces mientras usamos el scanf() función.

scanf("%d", &var);

Aquí, el valor ingresado por el usuario se almacena en la dirección de var variable. Tomemos un ejemplo práctico.

#include <stdio.h>
int main()
{
  int var = 5;
  printf("var: %d\n", var);

  // Notice the use of & before var
  printf("address of var: %p", &var);  
  return 0;
}

Salida

var: 5 
address of var: 2686778

Nota: Probablemente obtendrá una dirección diferente cuando ejecute el código anterior.


Puntero C

Los punteros (variables de puntero) son variables especiales que se utilizan para almacenar direcciones en lugar de valores.

Sintaxis de puntero

Así es como podemos declarar punteros.

int* p;

Aquí, hemos declarado un puntero p de int tipo.

También puede declarar punteros de estas formas.

int *p1;
int * p2;

Tomemos otro ejemplo de declaración de punteros.

int* p1, p2;

Aquí, hemos declarado un puntero p1 y una variable normal p2 .


Asignación de direcciones a punteros

Tomemos un ejemplo.

int* pc, c;
c = 5;
pc = &c;

Aquí, 5 se asigna a la c variable. Y, la dirección de c se asigna a la pc puntero.


Obtener el valor de la cosa señalada por punteros

Para obtener el valor de la cosa señalada por los punteros, usamos el * operador. Por ejemplo:

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // Output: 5

Aquí, la dirección de c se asigna a la pc puntero. Para obtener el valor almacenado en esa dirección, usamos *pc .

Nota: En el ejemplo anterior, pc es un puntero, no *pc . No puedes ni debes hacer algo como *pc = &c;

Por cierto, * se denomina operador de desreferencia (cuando se trabaja con punteros). Opera en un puntero y da el valor almacenado en ese puntero.


Cambiando valor apuntado por punteros

Tomemos un ejemplo.

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // Output: 1
printf("%d", *pc);  // Ouptut: 1

Hemos asignado la dirección de c al ordenador puntero.

Luego, cambiamos el valor de c a 1. Desde pc y la dirección de c es lo mismo, *pc nos da 1.

Tomemos otro ejemplo.

int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc);  // Ouptut: 1
printf("%d", c);    // Output: 1

Hemos asignado la dirección de c al ordenador puntero.

Luego, cambiamos *pc a 1 usando *pc = 1; . Desde ordenador y la dirección de c es lo mismo, c será igual a 1.

Tomemos un ejemplo más.

int* pc, c, d;
c = 5;
d = -15;

pc = &c; printf("%d", *pc); // Output: 5
pc = &d; printf("%d", *pc); // Ouptut: -15

Inicialmente, la dirección de c se asigna a la pc puntero usando pc = &c; . Desde c es 5, *pc nos da 5.

Luego, la dirección de d se asigna a la pc puntero usando pc = &d; . Desde d es -15, *pc nos da -15.


Ejemplo:Funcionamiento de Punteros

Tomemos un ejemplo práctico.

#include <stdio.h>
int main()
{
   int* pc, c;
   
   c = 22;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);  // 22
   
   pc = &c;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 22
   
   c = 11;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc); // 11
   
   *pc = 2;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c); // 2
   return 0;
}

Salida

Address of c: 2686784
Value of c: 22

Address of pointer pc: 2686784
Content of pointer pc: 22

Address of pointer pc: 2686784
Content of pointer pc: 11

Address of c: 2686784
Value of c: 2

Explicación del programa

  1. int* pc, c;

    Aquí, un puntero pc y una variable normal c , ambos de tipo int , es creado.
    Desde ordenador y c no se inicializan inicialmente, puntero pc apunta a ninguna dirección o a una dirección aleatoria. Y, variable c tiene una dirección pero contiene un valor de basura aleatorio.
  2. c = 22;

    Esto asigna 22 a la variable c . Es decir, 22 se almacena en la ubicación de memoria de la variable c .
  3. pc = &c;

    Esto asigna la dirección de la variable c al puntero pc .
  4. c = 11;

    Esto asigna 11 a la variable c .
  5. *pc = 2;

    Esto cambia el valor en la ubicación de memoria señalada por el puntero pc a 2.

Errores comunes al trabajar con punteros

Supongamos que desea el puntero pc para apuntar a la dirección de c . Entonces,

int c, *pc;

// pc is address but c is not
pc = c;  // Error

// &c is address but *pc is not
*pc = &c;  // Error

// both &c and pc are addresses
pc = &c;  // Not an error

// both c and *pc values 
*pc = c;  // Not an error

Este es un ejemplo de sintaxis de punteros que los principiantes suelen encontrar confusos.

#include <stdio.h>
int main() {
   int c = 5;
   int *p = &c;

   printf("%d", *p);  // 5
   return 0; 
}

¿Por qué no recibimos un error al usar int *p = &c;? ?

Es porque

int *p = &c;

es equivalente a

int *p:
p = &c;

En ambos casos, estamos creando un puntero p (no *p ) y asignando &c a ella.

Para evitar esta confusión, podemos usar la declaración como esta:

int* p = &c;

Ahora que sabe qué son los punteros, aprenderá cómo se relacionan los punteros con las matrices en el siguiente tutorial.


Lenguaje C

  1. C# Hello World:su primer programa en C#
  2. Identificadores y palabras clave de C#
  3. Variables de C# y tipos de datos (primitivos)
  4. Operadores de C#
  5. Operadores C# Bitwise y Bit Shift
  6. Entrada y salida básica de C#
  7. Expresiones, declaraciones y bloques de C# (con ejemplos)
  8. Comentarios de C#
  9. Punteros C
  10. Relación entre matrices y punteros
  11. Direcciones y punteros de C Pass