如何迭代指针指针?

时间:2011-07-10 14:14:37

标签: c string pointers char

假设我有以下变量:

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

我知道我可以通过这种方式迭代指向char数组的指针:

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

如何迭代指向指针的指针?

4 个答案:

答案 0 :(得分:4)

假设:

  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);

供您参考的好讨论是here

答案 1 :(得分:3)

对于你的例子:

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

答案 2 :(得分:1)

如果我没有误解你的问题,这段代码就应该找到工作

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

答案 3 :(得分:1)

让我举个例子

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个for循环,因为我要遍历字符串数组的每个字符。

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);