Punteros C (con ejemplos)

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

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

Dirección en C

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

Hemos utilizado la dirección en numerosas ocasiones mientras usamos la scanf()función.

 scanf("%d", &var);

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

 #include int main() ( int var = 5; printf("var: %d", var); // Notice the use of & before var printf("address of var: %p", &var); return 0; ) 

Salida

 var: 5 dirección de var: 2686778

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

Punteros C

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

Sintaxis del puntero

Así es como podemos declarar punteros.

 int* p;

Aquí, hemos declarado un puntero p de inttipo.

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.

Asignar direcciones a punteros

Pongamos un ejemplo.

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

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

Obtenga valor de las cosas señaladas por punteros

Para obtener el valor de la cosa apuntada 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 cse asigna al puntero de la PC. 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 llama operador de desreferencia (cuando se trabaja con punteros). Opera sobre un puntero y da el valor almacenado en ese puntero.

Cambio de valor señalado por punteros

Pongamos 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 puntero de la pc.

Luego, cambiamos el valor de c a 1. Como pc y la dirección de c es la misma, *pcnos 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 puntero de la pc.

Luego, cambiamos *pca 1 usando *pc = 1;. Como pc y la dirección de c es la misma, 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 al puntero de la PC mediante pc = &c;. Como c es 5, *pcnos da 5.

Luego, la dirección de d se asigna al puntero de pc usando pc = &d;. Dado que d es -15, *pcnos da -15.

Ejemplo: trabajo de punteros

Tomemos un ejemplo práctico.

 #include int main() ( int* pc, c; c = 22; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 22 pc = &c; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 22 c = 11; printf("Address of pointer pc: %p", pc); printf("Content of pointer pc: %d", *pc); // 11 *pc = 2; printf("Address of c: %p", &c); printf("Value of c: %d", c); // 2 return 0; ) 

Salida

 Dirección de c: 2686784 Valor de c: 22 Dirección de puntero pc: 2686784 Contenido de puntero pc: 22 Dirección de puntero pc: 2686784 Contenido de puntero pc: 11 Dirección de c: 2686784 Valor de c: 2 

Explicación del programa

  1. int* pc, c;

    Here, a pointer pc and a normal variable c, both of type int, is created.
    Since pc and c are not initialized at initially, pointer pc points to either no address or a random address. And, variable c has an address but contains random garbage value.
  2. c = 22;

    This assigns 22 to the variable c. That is, 22 is stored in the memory location of variable c.
  3. pc = &c;

    This assigns the address of variable c to the pointer pc.
  4. c = 11;

    This assigns 11 to variable c.
  5. *pc = 2;

    This change the value at the memory location pointed by the pointer pc to 2.

Common mistakes when working with pointers

Suppose, you want pointer pc to point to the address of c. Then,

 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; // both c and *pc values *pc = c;

Here's an example of pointer syntax beginners often find confusing.

 #include int main() ( int c = 5; int *p = &c; printf("%d", *p); // 5 return 0; )

Why didn't we get an error when using int *p = &c;?

It's because

 int *p = &c;

is equivalent to

 int *p: p = &c;

En ambos casos, estamos creando un puntero p(no *p) y asignándolo &c.

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.

Articulos interesantes...