Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

167
Views
Usando la palabra clave const en c

He estado mirando un código fuente, y me encontré con este código

 static char const *const delimit_method_string[] = { "none", "prepend", "separate", NULL };

Pensé que sabía el significado de la palabra clave const en el lenguaje C , pero después de ver esta sintaxis, estoy confundido porque no puedo decodificar el significado de la sintaxis, así que quería saber el significado de usar const así. Busqué en Internet y vi algunas preguntas como esta en stackoverflow que son,

  1. Significado de dos constantes en la firma C/C++
  2. Declaración de const doble

Pero aún no entiendo cuál es el significado de la sintaxis en ese fragmento de código, puede ser porque no soy lo suficientemente bueno con los fundamentos de C , pero realmente me gusta mejorarlo.

Así que escribí un código para saber cómo funciona esa sintaxis, esto es lo que probé:

 #include <stdio.h> int main() { char a = 'A'; char b = 'B'; char const * const ptr = &a; ptr = &b; printf("a is %c\n", *ptr); printf("a is %c", a); return 0; }

Obtuve esta salida, que algo esperaba.

 $ gcc test.c test.c: In function 'main': test.c:9:13: error: assignment of read-only variable 'ptr' 9 | ptr = &b; | ^

Cambié el código y volví a probar,

 #include <stdio.h> int main() { char a = 'A'; char b = 'B'; char const const *ptr = &a; ptr = &b; printf("a is %c\n", *ptr); printf("a is %c", a); return 0; }

esta vez el resultado no es lo que esperaba,

 $ ./a.exe a is B a is A

Realmente aprecio si alguien puede explicar cuál es la forma correcta de usar const en C y también cómo funciona la sintaxis en el primer fragmento de código.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Esta declaración

 static char const *const delimit_method_string[] = { "none", "prepend", "separate", NULL };

declara una matriz con el nombre delimit_method_string de punteros a literales de cadena.

En C, opuesto a C++, los literales de cadena tienen tipos de matrices de caracteres no constantes. Sin embargo, no puede cambiar un literal de cadena. Cualquier intento de cambiar un literal de cadena da como resultado un comportamiento indefinido. Por lo tanto, es mejor declarar punteros a literales de cadena de la siguiente manera, por ejemplo

 const char *s = "Hello";

Entonces podría declarar la matriz anterior como

 static char const * delimit_method_string[] = { "none", "prepend", "separate", NULL };

Pero el programador que declaró este arreglo también quería declarar at como un arreglo constante. Es decir, quería que sus elementos no se puedan cambiar.

Para la declaración anterior puede escribir por ejemplo

 delimit_method_string[0] = "all";

Para evitar tal cambio, los elementos de la matriz deben ser constantes. Para ello es necesario escribir

 static char const * const delimit_method_string[] = { "none", "prepend", "separate", NULL };

Ahora los elementos de la matriz que tienen el tipo de puntero const char * son constantes debido al segundo calificador const.

Tom deja más claro considerar las siguientes declaraciones.

 char *p;

Esta declaración declara un puntero no constante a un objeto no constante del tipo char .

 const char *p;

Esta declaración declara un puntero no constante a un objeto constante del tipo char .

 const char * const p;

Esta declaración declara un puntero constante a un objeto constante del tipo char .

La última declaración se puede reescribir como

 const char ( * const p );

En cuanto a esta su declaración

 char const const *ptr = &a;

entonces uno de los dos calificadores const es redundante porque ambos se refieren al especificador de tipo char .

over 4 years ago · Santiago Trujillo Report

0

char const const *ptr = &a;

Esta doble const no tiene ningún significado especial ya que ambas están en el mismo lado del * . El compilador ignora los calificadores const adicionales. Puede escribir char const const const const const*ptr = &a; Es lo mismo que char const *ptr = &a; lo que significa:

 pointer to constant character

Si lo cambiamos a

 char const * const ptr = &a;

Significará:

 constant pointer to constant char

Tu fragmento dejará de compilarse: https://godbolt.org/z/sM9qnv8fq

ejemplos:

  • const int *ptr; - puntero a entero constante
  • int * const ptr; - puntero constante a entero
  • const int * const ptr; - puntero constante a entero constante

Su primer ejemplo static char const *const delimit_method_string[] declara:

 static array of constant pointers to constant character

Por cierto, personalmente prefiero tener la primera const antes del tipo, es decir:

static const volatile char *const delimit_method_string[]

const char *p

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!