En C++ , cout muestra un comportamiento de impresión diferente con punteros/arrays de caracteres a diferencia de los punteros/arrays de otros tipos de datos. Entonces, este artículo primero explicará cómo cout se comporta de manera diferente con los punteros de caracteres, y luego se discutirá la razón y el mecanismo de trabajo detrás de esto.
Ejemplo 1:
C++
// C++ program to illustrate difference // between behaviour of integer pointer // and character pointer #include <iostream> using namespace std; // Driver Code int main() { // Integer array int a[] = { 1, 2, 3 }; // Character array char ch[] = "abc"; // Print the value of a and b cout << a << endl; cout << ch << endl; return 0; }
0x7ffc623e56c0 abc
Explicación:
Del código anterior, está claro que:
- Cuando se usa el puntero de entero a una array, cout imprime la dirección base de esa array de enteros.
- Pero cuando se usa el puntero de carácter, cout imprime la array completa de caracteres (hasta que encuentra un carácter nulo ) en lugar de imprimir la dirección base de la array de caracteres.
Ejemplo 2:
C++
// C++ program to illustrate behaviour // of character pointer pointing to // character array #include <iostream> using namespace std; // Driver Code int main() { // Character array b char b[] = "abc"; // Pointer to character array char* c = &b[0]; // Print the value of c cout << c << endl; }
abc
Explicación:
también en este ejemplo, el puntero de tipo de carácter c almacena la dirección base de la array de caracteres b[] y, por lo tanto, cuando se usa con cout , comienza a imprimir todos y cada uno de los caracteres desde esa dirección base hasta que encuentra un carácter NULL.
Ejemplo 3:
C++
// C++ program to illustrate difference // between behaviour of character and // character pointer #include <iostream> using namespace std; // Drive Code int main() { char c = '$'; char* p = &c; cout << c << endl; cout << p << endl; }
abc a a
Producción:
Explicación:
En el ejemplo anterior, c es una variable de carácter simple e imprime el valor almacenado en ella como se esperaba. p es un puntero de carácter cuando se usa con cout , da como resultado la impresión de todos y cada uno de los caracteres hasta que se encuentra un carácter nulo. Por lo tanto, se imprime algún valor basura después de ‘$’ . Esto simplemente significa que en la memoria, el carácter nulo se colocó después del carácter ‘a’ (ya que en este caso, no hay un almacenamiento automático de un carácter nulo después de que finaliza la pieza útil de datos, a diferencia de las arrays de caracteres), por lo que deja de imprimir y da la salida obtenida.
Razón detrás del comportamiento inusual con punteros de caracteres :
La razón de esto radica en el concepto de sobrecarga del operador. El operador ‘<<‘ está sobrecargado para diferentes tipos de entradas. En el caso de sobrecarga de const void* , imprime solo la dirección. Pero para la sobrecarga de const char* , comienza a imprimir todos y cada uno de los caracteres hasta que encuentra un carácter nulo (tratando la entrada como una string de estilo C).
Ejemplo 4:
C++
// C++ program to illustrate // printing of character array #include <iostream> using namespace std; // Driver Code int main() { // Character array char c[] = "abc"; // print value of c, c[0] and *c cout << c << endl; cout << c[0] << endl; cout << *c << endl; }
abc a a
Explicación: En el ejemplo anterior:
- Solo ‘c’ con cout se trata como const char * y << se llama a la sobrecarga del operador para dicha entrada y, por lo tanto, cada carácter se imprime hasta el carácter nulo.
- Cuando se usa c[0], es decir, *(c + 0), simplemente elimina la referencia a la ubicación de memoria particular e imprime el valor almacenado en esa ubicación solamente.
- De manera similar, para *c que es lo mismo que *(c + 0).
NOTA: El comportamiento inusual se puede corregir si la salida se convierte en algo que no se tratará como una string de estilo C.
Ejemplo 5:
C++
// C++ program to illustrate behaviour // of typecasted character pointer #include <iostream> using namespace std; // Driver Code int main() { char c[] = { "abc" }; char* b = c; cout << (void*)b; }
0x7ffe66f7f420
Explicación:
En el ejemplo anterior, la dirección base de la array de caracteres se obtiene en la salida.
Utilización de comportamiento inusual con punteros de caracteres :
Dada una string, imprima el patrón como se muestra en el siguiente ejemplo:
C++
// C++ program to illustrate the // utilization of unusual behaviour // of character pointer #include <iostream> using namespace std; // Function that prints the pattern void printPattern(char* ch) { // Base Condition if (*ch == '\0') return; // Recursion function call after // excluding the current character printPattern(ch + 1); // Print the whole string starting // from base address stored in 'ch' cout << ch << endl; } // Driver Code int main() { char ch[] = { "abcd" }; // Function Call printPattern(ch); return 0; }
d cd bcd abcd
Publicación traducida automáticamente
Artículo escrito por sargam123india y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA