Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,带有两个星号(**)的变量声明是什么意思?_C_Pointers - Fatal编程技术网

在C语言中,带有两个星号(**)的变量声明是什么意思?

在C语言中,带有两个星号(**)的变量声明是什么意思?,c,pointers,C,Pointers,我和C一起工作,我有点生疏了。我知道*有三种用途: 声明一个指针 取消对指针的引用 倍增 但是,当变量声明前有两个星号(**)时,这意味着什么: char **aPointer = ... 谢谢 Scott它声明了一个指向char指针的指针 此类指针的用途是执行以下操作: void setCharPointerToX(char ** character) { *character = "x"; //using the dereference operator (*) to get the

我和C一起工作,我有点生疏了。我知道
*
有三种用途:

  • 声明一个指针
  • 取消对指针的引用
  • 倍增
  • 但是,当变量声明前有两个星号(
    **
    )时,这意味着什么:

    char **aPointer = ...
    
    谢谢


    Scott

    它声明了一个指向
    char
    指针的指针

    此类指针的用途是执行以下操作:

    void setCharPointerToX(char ** character) {
       *character = "x"; //using the dereference operator (*) to get the value that character points to (in this case a char pointer
    }
    char *y;
    setCharPointerToX(&y); //using the address-of (&) operator here
    printf("%s", y); //x
    
    下面是另一个例子:

    char *original = "awesomeness";
    char **pointer_to_original = &original;
    (*pointer_to_original) = "is awesome";
    printf("%s", original); //is awesome
    
    对数组使用
    **

    char** array = malloc(sizeof(*array) * 2); //2 elements
    
    (*array) = "Hey"; //equivalent to array[0]
    *(array + 1) = "There";  //array[1]
    
    printf("%s", array[1]); //outputs There
    
    数组上的
    []
    运算符基本上对前面的指针执行指针运算,因此,对
    数组[1]
    的求值方法如下:

    array[1] == *(array + 1);
    
    这是数组索引从
    0
    开始的原因之一,因为:

    array[0] == *(array + 0) == *(array);
    

    这是指向
    char
    的指针。这意味着
    aPointer
    指向char指针

    所以

    其用法的一个示例是创建c字符串的动态数组

    char**aPointer=(char**)malloc(num_字符串)

    aPointer为您提供了一个字符,可用于表示以零结尾的字符串

    *aPointer = (char*)malloc( string_len + 1); //aPointer[0]
    *(aPointer + 1) = (char*)malloc( string_len + 1); //aPointer[1]
    

    C和C++允许使用指向指针的指针(比如说五次快)。请看下面的代码:

    char a;
    char *b;
    char **c;
    
    a = 'Z';
    b = &a; // read as "address of a"
    c = &b; // read as "address of b"
    
    变量
    a
    包含一个字符。变量
    b
    指向内存中包含字符的位置。变量
    c
    指向内存中包含指针的位置,该指针指向内存中包含字符的位置

    假设变量
    a
    将其数据存储在地址1000处(注意:示例内存位置已完全组成)。假设变量
    b
    将其数据存储在地址2000,变量
    c
    将其数据存储在地址3000。考虑到所有这些,我们有以下内存布局:

    MEMORY LOCATION 1000 (variable a): 'Z'
    MEMORY LOCATION 2000 (variable b): 1000 <--- points to memory location 1000
    MEMORY LOCATION 3000 (variable c): 2000 <--- points to memory location 2000
    
    内存位置1000(变量a):'Z'
    
    内存位置2000(变量b):1000它将
    aPointer
    声明为指向char的指针

    C语言中的声明以表达式类型为中心;它的通用名称是“声明模仿使用”。作为一个简单的例子,假设我们有一个指向int的指针,名为
    p
    ,我们想要访问它当前指向的整数值。我们将使用一元
    *
    运算符取消对指针的引用,如下所示:

    x = *p;
    
    表达式
    *p
    的类型是
    int
    ,因此指针变量
    p
    的声明是

    int *p;
    
    char **aPointer;
    
    在这种情况下,
    aPointer
    是指向char的指针;如果我们想获得它当前指向的字符值,我们必须取消对它的引用两次:

    c = **aPointer;
    
    因此,按照上面的逻辑,指针变量
    aPointer
    的声明是

    int *p;
    
    char **aPointer;
    
    因为表达式
    **aPointer
    的类型是
    char

    为什么会有指向指针的指针?它出现在多个上下文中:

    • 您需要一个函数来修改指针值;一个例子是
      strtol
      库函数,其原型(从C99开始)是 第二个参数是指向char的指针;调用strtol时,将指向char的指针的地址作为第二个参数传递,调用后它将指向字符串中未转换的第一个字符。

    • 请记住,在大多数上下文中,“T的N元素数组”类型的表达式隐式转换为“指向T的指针”类型,其值是数组第一个元素的地址。如果“T”是“指向字符的指针”,则“指向字符的指针的N元素数组”类型的表达式将转换为“指向字符的指针”。例如:
      
          void foo(char **arr)
          {
            size_t i = 0;
            for (i = 0; arr[i] != NULL; i++)
              printf("%s\n", arr[i]);
          }
      
          void bar(void)
          {
            char *ptrs[N] = {"foo", "bar", "bletch", NULL};
            foo(ptrs); // ptrs decays from char *[N] to char **
          }
      

    • 要动态分配多维数组:
      
      #define ROWS ...
      #define COLS ...
      ...
      char **arr = malloc(sizeof *arr * ROWS);
      if (arr)
      {
        size_t i;
        for (i = 0; i < ROWS; i++)
        {
          arr[i] = malloc(sizeof *arr[i] * COLS);
          if (arr[i])
          {
            size_t j;
            for (j = 0; j < COLS; j++)
            {
              arr[i][j] = ...;
            }
          }
        }
      }
      
      
      #定义行。。。
      #定义COLS。。。
      ...
      字符**arr=malloc(sizeof*arr*行);
      如果(arr)
      {
      尺寸i;
      对于(i=0;i

    感谢您的回复!指针指向指针的用例是什么?@Jacob-是:有效的C语法吗?我对此不熟悉。
    char**
    也可以表示字符串列表,例如
    argv
    或传递给
    execvp
    或类似对象的参数列表。@Matt这是真的。我应该在这里加上一个例子。