指向指针和指针数组的指针

ant*_*009 2 c pointers

gcc 4.4.4 c89

我理解指针好了.但是,我正在加紧指针数组和指针指针.

我一直在搞乱这个代码片段,并留下了我认为我理解的内容的评论.

非常感谢任何建议,如果我的评论与代码行一致吗?

void increment_ptr()
{
    /* Static char array */
    char src[] = "rabbit";
    /* pointer to array of pointers to char's - create 6 pointers in this array */
    char *dest[sizeof(src)];
    size_t i = 0;

    /* pointer to a char */
    char* chr_ptr = NULL;
    /* pointer to pointer that points to a char */
    char** ptr_ptr = NULL;

    /* chr_ptr pointer now points to the memory location where 'rabbit' is stored. */
    chr_ptr = src;
    /* ptr_ptr points to the first memory address of the pointer array of where dest is stored */
    ptr_ptr = dest;

    /* Deference chr_ptr and keep going until nul is reached 'rabbit\0'  */
    while(*chr_ptr != '\0')
        /* deference ptr_ptr and assign the address of each letter to the momory location where
           ptr_ptr is currently pointing to. */
        *ptr_ptr++ = chr_ptr++;

    /* reset the ptr_ptr to point to the first memory location 'rabbit' */
    ptr_ptr = dest;

    /* Keep going until NULL is found - However, my program never finds it, ends in UB */
    while(ptr_ptr != NULL) {
        /* Dereference what the pointer to pointer is pointing at the memory lcoation */
        printf("[ %s ]\n", *ptr_ptr++);
    }
}
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 7

每个部分下面的评论(我没有提到的位是正确的):

/* Static char array */
char src[] = "rabbit";
Run Code Online (Sandbox Code Playgroud)

此数组不是静态的 - 它具有auto存储持续时间.

/* pointer to array of pointers to char's - create 6 pointers in this array */
char *dest[sizeof(src)];
Run Code Online (Sandbox Code Playgroud)

这是一个指向char的指针数组,而不是指向数组的指针.数组的长度为7,因为它sizeof(src)是7(它包括nul字符串终止符).

/* chr_ptr pointer now points to the memory location where 'rabbit' is stored. */
chr_ptr = src;
Run Code Online (Sandbox Code Playgroud)

更准确地说,它指的是第一个字符src,即'r'in "rabbit".

/* ptr_ptr points to the first memory address of the pointer array of where dest is stored */
ptr_ptr = dest;
Run Code Online (Sandbox Code Playgroud)

它指向dest数组中的第一个指针.

/* Keep going until NULL is found - However, my program never finds it, ends in UB */
while(ptr_ptr != NULL) {
Run Code Online (Sandbox Code Playgroud)

正确 - 因为你从未初始化dest.您可以将声明更改为dest:

char *dest[sizeof(src)] = { 0 };
Run Code Online (Sandbox Code Playgroud)

......它会起作用.