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

Inicialización sencilla de matrices de punteros en C:consejos y mejores prácticas

Un puntero es una variable que almacena la dirección de otra variable. El nombre de la variable de puntero debe tener el prefijo "*". Al igual que en el caso de una variable normal, también podemos declarar una "matriz de punteros", donde cada subíndice de la matriz contiene la dirección de un tipo de matriz.

¿Cómo inicializar una matriz de punteros en C?

Una variable de puntero se puede inicializar en el momento de la declaración, asignándole la dirección de una variable existente. El siguiente fragmento muestra cómo inicializar un puntero:

int x = 10;
int *y = &x;

De forma predeterminada, todas las variables, incluidas las variables de puntero, pertenecen a la "clase de almacenamiento automático". Significa que una variable de puntero almacenará una dirección de memoria aleatoria, basura e impredecible, lo que puede provocar un comportamiento indefinido y riesgos potenciales para un programa, como errores de falla de segmentación. Por lo tanto, se debe inicializar en NULL si no tenemos un valor específico para almacenar en el momento de la declaración.

int *ptr = NULL;

Una "matriz de punteros" almacena la dirección en cada elemento. El tipo de matriz debe coincidir con el tipo de variable de destino.

Inicializar una matriz de punteros utilizando una palabra clave estática

También puede utilizar la palabra clave estática para inicializar una serie de punteros para almacenar "0" en cada subíndice.

Ejemplo

#include <stdio.h>
int main(){
 static int *ptr[5];
 for (int i = 0; i < 5; i++){
 printf("ptr[%d] = %d\n", i, ptr[i]); 
 }
 
 return 0;
}

Salida

Ejecute el código y verifique su salida -

ptr[0]= 0
ptr[1]= 0
ptr[2]= 0
ptr[3]= 0
ptr[4]= 0

Inicializar matriz de punteros enteros

Aquí, declaramos una matriz de punteros enteros y almacenamos las direcciones de tres variables enteras.

Ejemplo

#include <stdio.h>
int main(){
 int a = 10, b = 20, c = 30;
 int *ptr[3] = {&a, &b, &c};
 for (int i = 0; i < 3; i++){
 printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
 }
 
 return 0;
} 

Salida

Ejecute el código y verifique su salida -

ptr[0]: address: 6422040 value: 10
ptr[1]: address: 6422036 value: 20
ptr[2]: address: 6422032 value: 30

Inicializar matriz de puntero por direcciones directas

Podemos almacenar la dirección de cada elemento de una matriz normal en el elemento correspondiente de una matriz de puntero.

Ejemplo

#include <stdio.h>
int main(){
 int arr[] = {10, 20, 30};
 int *ptr[3] = {&arr[0], &arr[1], &arr[2]};
 for (int i = 0; i < 3; i++){
 printf("ptr[%d]: address: %d value: %d\n", i, ptr[i], *ptr[i]);
 }
 
 return 0;
}

Salida

Ejecute el código y verifique su salida -

ptr[0]: address: 6422032 value: 10
ptr[1]: address: 6422036 value: 20
ptr[2]: address: 6422040 value: 30

Atravesando una matriz con su dirección base

Cuando obtenemos la dirección base de una matriz (en este caso "&arr[0]"), podemos obtener las direcciones de sus elementos posteriores, sabiendo que el puntero se incrementa según el tamaño del tipo de datos.

Por lo tanto, solo con la dirección base (el nombre de la matriz es el mismo que la dirección del elemento 0), podemos recorrer una matriz.

Ejemplo 1

Eche un vistazo al siguiente ejemplo:

#include <stdio.h>
int main(){
 int arr[] = {10, 20, 30};
 int *ptr=arr;
 for (int i = 0; i < 3; i++){
 printf("ptr[%d]: address: %d value: %d\n", i,ptr+i, *(ptr+i));
 }
 
 return 0;
}

Salida

Ejecute el código y verifique su salida -

ptr[0]: address: 6422020 value: 10
ptr[1]: address: 6422024 value: 20
ptr[2]: address: 6422028 value: 30

Ejemplo 2:atravesar una matriz 2D usando una matriz de puntero

En este ejemplo, tenemos una matriz 2D. La dirección del elemento 0 de cada fila se almacena en una matriz de punteros. Al recorrer, la dirección almacenada en cada elemento de la matriz de puntero, que apunta al elemento 0 de la fila correspondiente, cada una se incrementa para recuperar los valores en cada fila.

#include <stdio.h>
int main(){
 // 2d array
 int arr[3][4] = {
 {1, 2, 3, 4},
 {5, 6, 7, 8},
 };
 int ROWS = 2, COLS = 4;
 int i, j;
 // pointer
 int (*ptr)[4] = arr;
 // print the element of the array via pointer ptr
 for (i = 0; i < ROWS; i++) {
 for (j = 0; j < COLS; j++) {
 printf("%d ", *(ptr[i]+j));
 }
 printf("\n");
 }
 
 return 0;
}

Salida

Cuando ejecute este código, producirá el siguiente resultado:

1 2 3 4 
5 6 7 8

Ejemplo 3

Realmente no necesitamos una matriz de puntero aquí, ya que podemos usar el nombre de esta matriz 2D como su puntero base e incrementarlo por filas y columnas para recuperar los elementos en la matriz 2D dada.

#include <stdio.h>
int main(){
 // 2d array
 int arr[3][4] = {
 {1, 2, 3, 4},
 {5, 6, 7, 8},
 };
 int ROWS = 2, COLS = 4;
 int i, j;
 // pointer
 int *ptr = arr;
 // print the element of the array via pointer ptr
 for (i = 0; i < ROWS; i++){
 for (j = 0; j < COLS; j++){
 printf("%d ", *(ptr + i * COLS + j));
 }
 printf("\n");
 }
 
 return 0;
}

Salida

El resultado se parece al del código anterior:

1 2 3 4 
5 6 7 8

Inicializar matriz de punteros de caracteres (cadena)

En programación C, una cadena es una matriz de tipo de datos char. Dado que el nombre de una matriz también representa la dirección de su elemento 0, una cadena se puede declarar como −

char arr[] = "Hello";

Usando la notación de puntero, se asigna una cadena a un puntero de carácter como −

char *arr = "Hello";

Luego podemos declarar una matriz de punteros de caracteres para almacenar múltiples cadenas de la siguiente manera:

char *arr[3] = {"string1", "string2", "string3", . . . };

Ejemplo

El siguiente ejemplo tiene una serie de punteros de caracteres que se utilizan para almacenar los nombres de los lenguajes informáticos:

#include <stdio.h>
int main(){
 char *langs [10] = {
 "PYTHON", "JAVASCRIPT", "PHP",
 "NODE JS", "HTML", "KOTLIN", "C++",
 "REACT JS", "RUST", "VBSCRIPT"
 };
 for(int i = 0; i < 10; i++)
 printf("%s\n", langs[i]);
 return 0;
}

Salida

Cuando ejecute este código, producirá el siguiente resultado:

PYTHON
JAVASCRIPT
PHP
NODE JS
HTML
KOTLIN
C++
REACT JS
RUST
VBSCRIPT

En este programa, "langs" es un puntero a una matriz de 10 cadenas. Por lo tanto, si "langs[0]" apunta a la dirección 5000, entonces "langs + 1" apuntará a la dirección 5004 que almacena el puntero a la segunda cadena.

Por lo tanto, también podemos usar la siguiente variación del bucle para imprimir la matriz de cadenas:

for (int i = 0; i < 10; i++){
 printf("%s\n", *(langs + i));
}

Inicialización de matriz dinámica de punteros

Puede utilizar la función malloc() para declarar e inicializar una matriz de punteros de forma dinámica.

Ejemplo

Eche un vistazo al siguiente ejemplo:

#include <stdio.h>
int main(){
 int *arr = (int *)malloc (sizeof (int) * 5); 
 for(int i = 0; i < 5; i++){
 arr[i] = i;
 }
 for (int x = 0; x < 5; x++){
 printf("%d %d\n", x, arr[x]);
 }
 
 return 0;
}

Salida

Cuando ejecute este código, producirá el siguiente resultado:

0 0
1 1
2 2
3 3
4 4

Incluso puede solicitar la entrada del usuario y asignar los valores a los elementos en el puntero de las matrices -

for(i = 0; i < 5; i++){
 scanf("%d", &x);
 arr[i] = x;
}

Lenguaje C

  1. Clase y método abstractos de C#
  2. Herencia pública, protegida y privada de C++
  3. Operadores de C#
  4. C# - Métodos anónimos
  5. Descripción general de C++
  6. C - definición de tipo
  7. Declaración de cambio de caso de C ++
  8. Realloc () Función en la biblioteca C:¿Cómo usar? Sintaxis y ejemplo
  9. Tokens C, identificadores, palabras clave:¿Qué son los tokens y sus tipos?
  10. Declaración de caso de cambio de C ++ con EJEMPLO
  11. Constructores C++