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:
-
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.
-
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.
-
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.