Aritmética de punteros en C con ejemplos

Las variables de puntero también se conocen como tipos de datos de dirección porque se utilizan para almacenar la dirección de otra variable. La dirección es la ubicación de memoria que se asigna a la variable. No almacena ningún valor. 

Por lo tanto, solo hay unas pocas operaciones que se permiten realizar en punteros en lenguaje C. Las operaciones son ligeramente diferentes de las que generalmente usamos para cálculos matemáticos. Las operaciones son: 

  1. Incremento/Decremento de un puntero
  2. Adición de entero a un puntero
  3. Resta de entero a un puntero
  4. Restar dos punteros del mismo tipo
  5. Comparación de punteros del mismo tipo.

Incremento/Decremento de un puntero

Incremento: Es una condición que también entra en la suma. Cuando se incrementa un puntero, en realidad se incrementa en un número igual al tamaño del tipo de datos para el que es un puntero. 

Por ejemplo: 
si se incrementa un puntero de número entero que almacena la dirección 1000 , se incrementará en 2 ( tamaño de un int ) y la nueva dirección apuntará a 1002 . Mientras que si se incrementa un puntero de tipo flotante, se incrementará en 4 ( tamaño de un flotante ) y la nueva dirección será 1004 .
Decremento: Es una condición que también entra en la sustracción. Cuando se reduce un puntero, en realidad se reduce en un número igual al tamaño del tipo de datos para el que es un puntero. 

Por ejemplo:  si se reduce
un puntero de número entero que almacena la dirección 1000 , se reducirá en 2 ( tamaño de un int ) y la nueva dirección apuntará a 998 . Mientras que si se reduce un puntero de tipo flotante, disminuirá en 4 ( tamaño de un flotante ) y la nueva dirección será 996 .

A continuación se muestra el programa para ilustrar el incremento/decremento del puntero: 

C

// C program to illustrate
// pointer increment/decrement
 
#include <stdio.h>
 
// Driver Code
int main()
{
    // Integer variable
    int N = 4;
 
    // Pointer to an integer
    int *ptr1, *ptr2;
 
    // Pointer stores
    // the address of N
    ptr1 = &N;
    ptr2 = &N;
 
    printf("Pointer ptr1 "
           "before Increment: ");
    printf("%p \n", ptr1);
 
    // Incrementing pointer ptr1;
    ptr1++;
 
    printf("Pointer ptr1 after"
           " Increment: ");
    printf("%p \n\n", ptr1);
 
    printf("Pointer ptr1 before"
           " Decrement: ");
    printf("%p \n", ptr1);
 
    // Decrementing pointer ptr1;
    ptr1--;
 
    printf("Pointer ptr1 after"
           " Decrement: ");
    printf("%p \n\n", ptr1);
 
    return 0;
}
Producción

Pointer ptr1 before Increment: 0x7ffefa9c5704 
Pointer ptr1 after Increment: 0x7ffefa9c5708 

Pointer ptr1 before Decrement: 0x7ffefa9c5708 
Pointer ptr1 after Decrement: 0x7ffefa9c5704 

Suma

Cuando se agrega un puntero con un valor, el valor primero se multiplica por el tamaño del tipo de datos y luego se agrega al puntero.

C

// C program to illustrate pointer Addition
#include <stdio.h>
 
// Driver Code
int main()
{
    // Integer variable
    int N = 4;
 
    // Pointer to an integer
    int *ptr1, *ptr2;
 
    // Pointer stores the address of N
    ptr1 = &N;
    ptr2 = &N;
 
    printf("Pointer ptr2 before Addition: ");
    printf("%p \n", ptr2);
 
    // Addition of 3 to ptr2
    ptr2 = ptr2 + 3;
    printf("Pointer ptr2 after Addition: ");
    printf("%p \n", ptr2);
 
    return 0;
}
Producción

Pointer ptr2 before Addition: 0x7fffc22348a4 
Pointer ptr2 after Addition: 0x7fffc22348b0 

Sustracción

Cuando se resta un puntero con un valor, el valor primero se multiplica por el tamaño del tipo de datos y luego se resta del puntero.

A continuación se muestra el programa para ilustrar la resta de puntero:

C

// C program to illustrate pointer Subtraction
#include <stdio.h>
 
// Driver Code
int main()
{
    // Integer variable
    int N = 4;
 
    // Pointer to an integer
    int *ptr1, *ptr2;
 
    // Pointer stores the address of N
    ptr1 = &N;
    ptr2 = &N;
 
    printf("Pointer ptr2 before Subtraction: ");
    printf("%p \n", ptr2);
 
    // Subtraction of 3 to ptr2
    ptr2 = ptr2 - 3;
    printf("Pointer ptr2 after Subtraction: ");
    printf("%p \n", ptr2);
 
    return 0;
}
Producción

Pointer ptr2 before Subtraction: 0x7ffcbed44ee4 
Pointer ptr2 after Subtraction: 0x7ffcbed44ed8 

Resta de dos punteros

La resta de dos punteros solo es posible cuando tienen el mismo tipo de datos. El resultado se genera calculando la diferencia entre las direcciones de los dos punteros y calculando cuántos bits de datos hay según el tipo de datos del puntero. La resta de dos punteros da los incrementos entre los dos punteros. 

Por ejemplo: 
se restan dos punteros enteros que dicen ptr1 (dirección: 1000) y ptr2 (dirección: 1016) . La diferencia entre direcciones es de 16 bytes. Dado que el tamaño de int es de 2 bytes, el incremento entre ptr1 y ptr2 viene dado por (16/2) = 8 .

A continuación se muestra la implementación para ilustrar la resta de dos punteros:

C

// C program to illustrate Subtraction
// of two pointers
#include <stdio.h>
 
// Driver Code
int main()
{
    int x;
 
    // Integer variable
    int N = 4;
 
    // Pointer to an integer
    int *ptr1, *ptr2;
 
    // Pointer stores the address of N
    ptr1 = &N;
    ptr2 = &N;
 
    // Incrementing ptr2 by 3
    ptr2 = ptr2 + 3;
 
    // Subtraction of ptr2 and ptr1
    x = ptr2 - ptr1;
 
    // Print x to get the Increment
    // between ptr1 and ptr2
    printf("Subtraction of ptr1 "
           "& ptr2 is %d\n",
           x);
 
    return 0;
}
Producción

Subtraction of ptr1 & ptr2 is 3

Aritmética de punteros en arrays: los 
punteros contienen direcciones. Agregar dos direcciones no tiene sentido porque no hay idea de a qué apuntaría. Restar dos direcciones le permite calcular el desplazamiento entre las dos direcciones. Un nombre de array actúa como una constante de puntero. El valor de esta constante de puntero es la dirección del primer elemento. Por ejemplo: si una array se llama arr, arr y &arr[0] se pueden usar para hacer referencia a la array como un puntero.

A continuación se muestra el programa para ilustrar la aritmética de punteros en arrays:

Programa 1: 

C

// C program to illustrate the array
// traversal using pointers
#include <stdio.h>
 
// Driver Code
int main()
{
 
    int N = 5;
 
    // An array
    int arr[] = { 1, 2, 3, 4, 5 };
 
    // Declare pointer variable
    int* ptr;
 
    // Point the pointer to first
    // element in array arr[]
    ptr = arr;
 
    // Traverse array using ptr
    for (int i = 0; i < N; i++) {
 
        // Print element at which
        // ptr points
        printf("%d ", ptr[0]);
        ptr++;
    }
}
Producción

1 2 3 4 5 

Programa 2: 

C

// C program to illustrate the array
// traversal using pointers in 2D array
#include <stdio.h>
 
// Function to traverse 2D array
// using pointers
void traverseArr(int* arr,
                 int N, int M)
{
 
    int i, j;
 
    // Traverse rows of 2D matrix
    for (i = 0; i < N; i++) {
 
        // Traverse columns of 2D matrix
        for (j = 0; j < M; j++) {
 
            // Print the element
            printf("%d ", *((arr + i * M) + j));
        }
        printf("\n");
    }
}
 
// Driver Code
int main()
{
 
    int N = 3, M = 2;
 
    // A 2D array
    int arr[][2] = { { 1, 2 },
                     { 3, 4 },
                     { 5, 6 } };
 
    // Function Call
    traverseArr((int*)arr, N, M);
    return 0;
}
Producción

1 2 
3 4 
5 6 

Comparación de punteros del mismo tipo:

Podemos comparar los dos punteros usando los operadores de comparación en C. Podemos implementar esto usando todos los operadores en C >, >=, <, <=, ==, !=.  Devuelve verdadero para la condición válida y devuelve falso para la condición insatisfecha. 

Paso 1: inicialice los valores enteros y apunte estos valores enteros al puntero.

Paso 2: ahora, verifique la condición usando operadores de comparación o relacionales en variables de puntero.

Paso 3: Mostrar la salida.

C

#include <stdio.h>
 
int main() {
 
    // code
    int num1=5,num2=6,num3=5; //integer input
    int *p1=&num1;// addressing the integer input to pointer
    int *p2=&num2;
    int *p3=&num3;
    //comparing the pointer variables.
   if(*p1<*p2)
   {
       printf("\n%d less than %d",*p1,*p2);
   }
   if(*p2>*p1)
   {
     printf("\n%d greater than %d",*p2,*p1);
   }
   if(*p3==*p1)
   {
      printf("\nBoth the values are equal");
   }
   if(*p3!=*p2)
   {
      printf("\nBoth the values are not equal");
   }
   
 
    return 0;
}
Producción

5 less than 6
6 greater than 5
Both the values are equal
Both the values are not equal

Operadores de comparación en punteros usando array:

En el siguiente enfoque, resulta el conteo de números pares e impares en una array. Vamos a implementar esto usando un puntero.

Paso 1: Primero, declare la longitud de una array y los elementos de la array. 

Paso 2: Declare la variable puntero y apúntela al primer elemento de una array. 

Paso 3:Inicialice count_even y count_odd. Itere el ciclo for y verifique las condiciones para el número de elementos impares y elementos pares en una array,

Paso 4: Incremente la ubicación del puntero ptr++ al siguiente elemento en una array para una mayor iteración.

Paso 5: Imprime el resultado.

C

#include <stdio.h>
 
int main()
{
    int n = 10; // length of an array
 
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* ptr; // Declaration of pointer variable
 
    ptr = arr; // Pointer points the first (0th index)
               // element in an array
    int count_even = 0;
    int count_odd = 0;
 
    for (int i = 0; i < n; i++) {
 
        if (*ptr % 2 == 0) {
            count_even++;
        }
        if (*ptr % 2 != 0) {
            count_odd++;
        }
        ptr++; // Pointing to the next element in an array
    }
    printf("\n No of even elements in an array is : %d",
           count_even);
    printf("\n No of odd elements in an array is : %d",
           count_odd);
}
Producción

 No of even elements in an array is : 5
 No of odd elements in an array is : 5

Publicación traducida automáticamente

Artículo escrito por vishalraina y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *