这个符号在C语言中意味着什么?

时间:2014-12-06 04:17:36

标签: c

您好我是C语言的新手,有人可以解释**符号的含义。

typedef struct _TREENODE {
        struct _TREENODE *Left, *Right;
        TCHAR key[KEY_SIZE];
        LPTSTR pData;
    } TREENODE, *LPTNODE, **LPPTNODE;

6 个答案:

答案 0 :(得分:2)

如果x是指针,*x取消引用它。 **x*(*x)相同,因此** x取消引用指向指针的指针。 (例如,它是x选择的东西指向的东西。)

答案 1 :(得分:2)

**是指向指针的指针,它也用于取消引用指针变量。

 eg: int a=10,*b,**c;

    b=&a;
    c=&b;
    printf("the a value is:%d\n",a);

    printf("the b value is:%d\n",*b);
    printf("the c value is:%d\n",**c);

只需执行此代码,您就可以了解指向指针的想法。

答案 2 :(得分:0)

关于C中的*,有两件事需要了解:

  1. 这是一项操作。对指针执行*x取消引用指针。对指针执行**x可以取消引用指向的指针,依此类推。

  2. 这是一种类型。声明int *x类型意味着它是 int 类型的指针。声明int **x表示它是指向 int 类型的指针指针。

  3. 示例:

    int main() {
       int foo = 4;
       int *bar = &foo;  // declaring a pointer to int type *bar
       int **baz = &bar;  // declaring a pointer to a pointer to int type **baz
       printf("foo: %d, *bar: %d, **baz: %d\n", foo, *bar, **baz);  // derefencing the pointer *bar and **baz
       return 0;
    }
    

答案 3 :(得分:0)

在您想要更改变量时,您可以通过指针传递它(到变量)。

如果你想改变一个指针,你也可以通过指针(到指针)传递它,这是一个双指针。

答案 4 :(得分:0)

在声明中,**表示指向指针的指针。在计算表达式时,**取消引用指向指针的指针。

int** p; // Declares p to be a pointer to a pointer.

和...

**p = 10;  // Dereferences p and assigns 10 to a memory location.

指针指针的一个常见用法是表示动态2D数组。例如,如果要创建M行和N列的矩阵,则可以执行以下操作:

 int** matrix = malloc(M*sizeof(*matrix));
 int i = 0, j = 0;
 for ( i = 0; i < M; ++i )
    matrix[i] = malloc(N*sizeof(*matrix[0]));

双指针的用法:

 for ( i = 0; i < M; ++i )
    for ( j = 0; j < N; ++j )
       matrix[i][j] = 0; // Assigns a value to the element
                         // at the i-th row and j-th column.

如果要使用字符串指针取消引用,可以使用:

 for ( i = 0; i < M; ++i )
    for ( j = 0; j < N; ++j )
       *(*(matrix+i)+j) = 0;

分配给矩阵的内存也必须在两遍中释放。

 for ( i = 0; i < M; ++i )
    free(matrix[i]);
 free(matrix);

答案 5 :(得分:0)

**表示指向指针的指针。

我大多数时候都认为它是“指针”到“存储区”。实际上这可能有点多余。

例如,假设你必须在内存中动态存储几个单词,你会怎么做?有几种方法可以做到这一点,但我将提供一个示例来说明**的使用。

现在,假设您要存储三个字: hi hello 再见

hi hello goodbye 是字符串,它们分别在内存上消耗2,5和7个字节。嗯,实际上由于\0它有3个,6个和8个字节,但是不能让我们了解很多细节。

但有一件事是清楚的,我们需要三个存储区来保存这些字符串,还有三个指针来引用这些存储区。

请注意,可以只声明指向这些内存区域的三个指针,但是,您是否愿意声明一千个指针来容纳一千个单词?这是**开始的地方。

示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUMBER_OF_WORDS 3

int
main(int argc, char **argv)
{
        int  i;
        char **words;

        /* pointers */
        words    = malloc(sizeof(char*)*NUMBER_OF_WORDS);

        /* memory areas*/
        words[0] = strdup("Hi");
        words[1] = strdup("Hello");
        words[2] = strdup("Goodbye");

        for(i=0; i < NUMBER_OF_WORDS; i++)
                printf("%d) %s\n", i, words[i]);

        for(i=0; i < NUMBER_OF_WORDS; i++)
                free(words[i]); /* memory area */
        free(words); /* pointers */

        return 0;
}