Как перебрать указатель на указатель? - PullRequest
0 голосов
/ 10 июля 2011

Допустим, у меня есть следующие переменные:

char c[] = "ABC";
char *ptr = &c;
char **ptr2 = &ptr;

Я знаю, что могу перебрать указатель на массив символов следующим образом:

int i;
for(i=0; i<3; i++){
    printf("TEST******************, %c\n", ptr[i]);
}

Как перебиратьпо указателю на указатель?

Ответы [ 4 ]

4 голосов
/ 10 июля 2011

Предположим:

  6   char c[] = "ABC";
  7 
  8   char *ptr   = &c;
  9   char *ptr2  = ptr;       
 10   char **ptr3 = &ptr;   

enter image description here

В этом сценарии:

  • ptr представляет адрес c
  • ptr2 представляет адрес ptr. Указатель на указатель
  • ptr3 - это значение , сохраненное в ptr, то есть адрес c.

**ptr3=&ptr означает - Возьмите адрес ptr, посмотрите внутрь и присвойте его значение (не адрес) ptr3

Если я правильно понял ваш вопрос, вам нужноиспользовать указатели на указатели: ptr2 в моем примере вместо ptr3

Если это так, вы можете получить доступ к таким элементам, как:

ptr2[0] = A
ptr2[1] = B
ptr2[2] = C

Для записи следующее приведет к тому жеРезультаты.Попробуйте.

 12   printf ("===>>> %x\n", ptr2);
 13   printf ("===>>> %x\n", *ptr3);

Хорошее обсуждение для вашей справки: здесь

3 голосов
/ 10 июля 2011

Для вашего примера:

int i;
for(i=0; i<3; i++){
    printf("TEST******************, %c\n", (*ptr2)[i]);
}
1 голос
/ 25 июня 2018

позвольте мне привести пример,

char **str; // double pointer declaration
str = (char **)malloc(sizeof(char *)*2);
str[0]=(char *)"abcdefgh";   // or *str  is also fine instead of str[0]
str[1]=(char *)"lmnopqrs";

while(*str!=NULL)
{
    cout<<*str<<endl; // prints the string
    str++;
}
free(str[0]);
free(str[1]);
free(str);

или еще один лучший пример, который вы можете понять.здесь я использовал 2 для циклов, потому что я перебираю каждый символ массива строк.

char **str = (char **)malloc(sizeof(char *)*3); // it allocates 8*3=24 Bytes
str[0]=(char *)"hello";    // 5 bytes 
str[1]=(char *)"world";    // 5 bytes
// totally 10 bytes used out of 24 bytes allocated
while(*str!=NULL)   // this while loop is for iterating over strings
{
    while(**str!=NULL)   // this loop is for iterating characters of each string
    {
         cout<<**str;
    }
    cout<<endl;
    str++;
}
free(str[0]);
free(str[1]);
free(str);
1 голос
/ 10 июля 2011

Если я не понял вашего вопроса, этот код должен работать

printf("TEST******************, %c\n", (*ptr2)[i]);
...