【问题标题】:Pointer to a pointer C指向指针 C 的指针
【发布时间】:2021-12-31 03:41:41
【问题描述】:
{   
    char *x = "abc";
    int * y  = &x;
    printf("%s", *(*y));

    return 0;
}

这不起作用,我很难弄清楚原因

一般来说,我只是想通过指向指针的指针来访问字符串,但我不知道如何

谢谢!

【问题讨论】:

  • char *x = "abc"; 不是一个好主意。 "abc"const chars 的数组。让const char *x = "abc";
  • int * y = &x; 在您的脑海中应该做什么? y 的双重取消引用应该做什么?你认为你会在哪里结束呢?
  • 不起作用?怎么样?
  • 所以我想让y有x的内存位置的值,这样y指向x,x指向字符串
  • 我没有得到将 abc 声明为指针的用例。

标签: c pointers


【解决方案1】:

为什么它不起作用?

int *y 是指向 int 的指针(不是指向指针的指针),*yint。整数值不是指针,因此无法取消引用 - 因此编译器错误。我正在从字符串别名规则中抽象出来。您需要记住不要使用其他指针类型取消引用指针。它是 C 中的 UB。

int main(void){   
    char *x = "abc";
    char **y  = &x;   // pointer to pointer to char
    printf("`%s`\n", *y);  // single derefence gives pointer to char
    printf("'%c'\n", **y); // double dereference gives char

    return 0;
}

https://www.godbolt.org/z/aoEz57o5d

【讨论】:

    【解决方案2】:

    指针存储一个内存地址。如果您已经声明了一个变量和一个指向该变量的指针,则该指针将存储它所指向的变量的地址。下面是一个使用 cmets 的示例。

    int a = 1;      // allocated at 0x100, content is 1.
    int* ptrA = &a; // allocated at 0x200, content is 0x100 (address of 'a')
    

    为了通过指针访问 'a' 的内容,你必须解引用它,这是通过解引用运算符 (*) 完成的。

    printf("'a' content is %d", *ptrA);
    

    指向一个指针的指针也存储一个内存地址,但在这种情况下,是另一个指针的内存地址。如果您已经声明了一个变量、一个指向该变量的指针和一个指向该变量指针的指针,则第一个指针仍然像第一个示例中一样存储变量的地址,而最后一个指针存储第一个指针的地址。下面是一个使用 cmets 的示例。

    int a = 1;               // allocated at 0x100, content is 1.
    int* ptrA = &a;          // allocated at 0x200, content is 0x100 (address of 'a')
    int** ptrToPtrA = &ptrA; // allocated at 0x300, content is 0x200 (address of 'ptrA')
    

    为了通过指向指针的指针访问“a”的内容,您必须取消引用它,一次用于检索指向指针“ptrToPtrA”(指针“ptrA”)的指针的内容,然后从这里开始,一次用于检索指针'ptrA'的内容(变量内容'1')。

    printf("'a' content is %d", **ptrToPtrA);
    

    下面是 cmets 的最后一个示例,更接近您的原始问题。

    #include <stdio.h>                                                                                                      
                                                                                                                            
    int main(void)                                                                                                          
    {                                                                                                                       
        // pointer to char (stores the address of a char)                                                                   
        char* x = "abc";                                                                                                    
        printf("'x' address is #%p, content is %c\n", x, *x);                                                               
                                                                                                                            
         // pointer to pointer to char (stores the addres of a pointer to char)                                             
        char** xPtr = &x;                                                                                                                          
        printf("'xPtr' address is #%p, content is %p\n", xPtr, *xPtr);                                                      
        printf("'x' content through 'xPtr' is %c\n", **xPtr);                                                               
                                                                                                                            
        return 0;                                                                                                           
    }     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2011-04-24
      • 2019-09-10
      • 1970-01-01
      • 2010-09-08
      • 2017-08-25
      相关资源
      最近更新 更多