1. Основная концепция -
Когда вы заявляете следующее: -
1. char * ch - (вызываемый символьный указатель)
- ch содержит адрес одного символа.
- (* ch) будет разыменовывать значение символа.
2. символ ** ч -
'ch' содержит адрес массива указателей символов. (как в 1)
«* ch» содержит адрес одного символа. (Обратите внимание, что он отличается от 1 из-за разницы в объявлении).
(** ch) будет разыменовывать точное значение символа.
Добавление дополнительных указателей расширяет размерность типа данных, от символа к строке, до массива строк и т. Д. ... Вы можете связать его с 1d, 2d, 3d матрицей.
Итак, использование указателя зависит от того, как вы его объявили.
Вот простой код ..
int main()
{
char **p;
p = (char **)malloc(100);
p[0] = (char *)"Apple"; // or write *p, points to location of 'A'
p[1] = (char *)"Banana"; // or write *(p+1), points to location of 'B'
cout << *p << endl; //Prints the first pointer location until it finds '\0'
cout << **p << endl; //Prints the exact character which is being pointed
*p++; //Increments for the next string
cout << *p;
}
2. Другое применение двойных указателей -
(это также относится к передаче по ссылке)
Предположим, вы хотите обновить персонажа из функции. Если вы попробуете следующее: -
void func(char ch)
{
ch = 'B';
}
int main()
{
char ptr;
ptr = 'A';
printf("%c", ptr);
func(ptr);
printf("%c\n", ptr);
}
Выход будет АА. Это не работает, так как вы "передали по значению" в функцию.
Правильный способ сделать это будет -
void func( char *ptr) //Passed by Reference
{
*ptr = 'B';
}
int main()
{
char *ptr;
ptr = (char *)malloc(sizeof(char) * 1);
*ptr = 'A';
printf("%c\n", *ptr);
func(ptr);
printf("%c\n", *ptr);
}
Теперь расширьте это требование для обновления строки вместо символа.
Для этого вам необходимо получить параметр в функции в виде двойного указателя.
void func(char **str)
{
strcpy(str, "Second");
}
int main()
{
char **str;
// printf("%d\n", sizeof(char));
*str = (char **)malloc(sizeof(char) * 10); //Can hold 10 character pointers
int i = 0;
for(i=0;i<10;i++)
{
str = (char *)malloc(sizeof(char) * 1); //Each pointer can point to a memory of 1 character.
}
strcpy(str, "First");
printf("%s\n", str);
func(str);
printf("%s\n", str);
}
В этом примере метод ожидает двойной указатель в качестве параметра для обновления значения строки.