Функциональное тело манипулирует копиями своих аргументов. Поэтому, когда вы хотите изменить какую-либо переменную, которую вы передаете как аргумент функции, вам действительно нужно передать адрес переменной - ее указатель. Функция получает копию этого указателя, который имеет адрес исходной переменной, поэтому функция может изменить значение переменной. Точно так же, когда вы хотите изменить значение некоторого указателя, вам необходимо передать его адрес в качестве аргумента функции.
Типичным примером может быть случай, когда функции необходимо перераспределить память для некоторой структуры данных. В этом примере мы хотим передать массив символов в функцию, которая добавляет к ней один символ. Функция должна перераспределять память для нового (расширенного) массива, что означает, что ее указатель должен указывать на новое место в памяти - это значение нужно изменить. Обратите внимание на линию, где * р (разыменованный указатель на указатель) присваивается значение:
#include <iostream>
using namespace std;
void append_char(char** pp, char ch)
{
// copy of pp is passed here
if(pp)
{
if(*pp)
{
// pointer is already pointing to formed array of characters
// 1. allocate memory for a new (extended) array
int nLen = strlen(*pp);
// one place for ch and one for zero-termination
int nNewLen = nLen + 2;
char* pNewStr = new char[nNewLen];
// 2. copy existing array into a new one
strcpy(pNewStr, (const char*)*pp);
// 3. append new character
pNewStr[nNewLen - 2] = ch;
pNewStr[nNewLen - 1] = '\0';
// 4. free memory of old array
delete[] *pp;
// 5. assign new pointer's value
*pp = pNewStr;
}
else
{
// pointer is NULL - passed character will be the first in a new array
// 1. allocate memory, fill the array and assign new pointer's value
*pp = new char[2];
(*pp)[0] = ch;
(*pp)[1] = '\0';
}
}
}
int main()
{
char* p = new char[3];
p[0] = 'A';
p[1] = 'B';
p[2] = '\0';
cout << p << endl;
append_char(&p, 'C');
cout << p << endl;
delete[] p;
return 0;
}
Я использовал строку C-стиль здесь, как это общий пример управления памятью. В коде на C++ попробуйте избежать строк C и использовать операторы слияния C++.
«двойной указатель», вы имеете в виду 'double *' или 'something **'? –
Я думаю, что он имеет в виду указатель на указатель, но да, не сформулированный хорошо. –
Я предполагаю, что он означает указатель на указатель – CashCow