La diferencia entre los parámetros de función c/c++ char*a y char*&a

El autor se centra en el campo de la seguridad de Android. Bienvenido a prestar atención a mi cuenta pública personal de WeChat "Ingeniería de seguridad de Android" (haga clic para escanear el código a seguir). La cuenta pública personal de WeChat se enfoca principalmente en la protección de seguridad y el análisis inverso de las aplicaciones de Android, compartiendo varios métodos de ataque y defensa de seguridad, tecnología Hook, compilación ARM y otros conocimientos relacionados con Android.

char* a es un puntero que apunta a una variable de tipo char oa un espacio de memoria de tipo char. En la lista de parámetros de la función, char* a indica que se pasa un puntero al tipo char a la función como parámetro.

char*& a es una referencia de puntero a un puntero de tipo char. En la lista de parámetros de la función, char*& a significa pasar una referencia a un puntero de tipo char como parámetro de la función.

Cuando se usa char* a como parámetro de función, la función puede modificar el contenido del espacio de memoria al que apunta a, pero no puede modificar la dirección a la que apunta a; mientras que se usa char*& a como parámetro de función, la función puede modificar la dirección a la que apunta a, cambiando así la ubicación y el contenido del espacio de memoria apuntado por a.

Aquí hay un ejemplo usando char* a y char*& a:

void foo(char* a)
{
    
    
    // 修改 a 所指向的内存空间的内容
    *a = 'A';
}

void bar(char*& a)
{
    
    
    // 修改 a 指向的地址
    a = new char[2];
    // 修改 a 所指向的内存空间的内容
    *a = 'B';
}

int main()
{
    
    
    char c = 'a';
    char* ptr = &c;
    // 使用 char* a 调用函数 foo
    foo(ptr);
    // c 的值被修改为 'A'
    std::cout << c << std::endl;

    char* ptr2 = &c;
    // 使用 char*& a 调用函数 bar
    bar(ptr2);
    // ptr2 指向新的内存空间,其中第一个元素的值为 'B'
    std::cout << *ptr2 << std::endl;

    // 必须释放动态分配的内存
    delete[] ptr2;
    return 0;
}

char* a y char*& a se usan de manera diferente:

  1. Cuando la función necesita modificar el contenido del espacio de memoria al que apunta el puntero pasado, pero no necesita modificar el puntero en sí, se debe usar char* a.

  2. Cuando la función necesita modificar el contenido del espacio de memoria apuntado por el puntero pasado y necesita usar el nuevo espacio de memoria apuntado por el puntero fuera de la función, se puede usar char*&a. En este caso, el operador new debe usarse dentro de la función para asignar nuevo espacio de memoria, y la persona que llama es responsable de liberar este espacio de memoria cuando corresponda.

  3. Cuando la función necesita modificar la dirección a la que apunta el puntero pasado, se debe usar char*&a. En este caso, la función puede cambiar la ubicación del espacio de memoria señalado por el puntero, lo que significa que la persona que llama debe prestar atención a si necesita reasignar el espacio de memoria y liberar el espacio de memoria anterior.

El uso de char* a significa que la función no cambiará el valor del puntero en sí, pero puede modificar el contenido del espacio de memoria al que apunta el puntero. Y el uso de char*& a indica que la función puede cambiar el valor del propio puntero y puede asignar un nuevo espacio de memoria dentro de la función para almacenar el contenido modificado.

¿Por qué no se puede modificar la dirección a la que apunta char* a después de pasarla?
Al pasar char* a, lo que realmente se pasa es la dirección que apunta a un espacio de memoria. La función puede acceder y modificar el contenido de este espacio de memoria a través de esta dirección, pero no puede modificar la dirección en sí.

Esto se debe a que los parámetros se pasan por valor cuando se llama a la función. Es decir, lo que se pasa a la función es una copia del puntero, no el puntero en sí. Cuando la función modifica la dirección a la que apunta char* a, en realidad solo modifica la copia del parámetro sin cambiar el valor del puntero original. Por lo tanto, modificar la dirección apuntada por char* a no tiene efecto en el puntero original.

Si necesita modificar el valor del puntero en sí, puede usar char*& a. En este momento, lo que se pasa es una referencia a un puntero, y la función puede modificar el valor del propio puntero a través de la referencia, cambiando así la dirección a la que apunta el puntero.

Supongo que te gusta

Origin blog.csdn.net/HongHua_bai/article/details/130278707
Recomendado
Clasificación