Comportamiento inusual con punteros de caracteres

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;
}
Producción:

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;
}
Producción:

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;
}
Producción:

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;
}
Producción:

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;
}
Producción:

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;
}
Producción:

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

Deja una respuesta

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