您好我是C语言的新手,有人可以解释**符号的含义。
typedef struct _TREENODE {
struct _TREENODE *Left, *Right;
TCHAR key[KEY_SIZE];
LPTSTR pData;
} TREENODE, *LPTNODE, **LPPTNODE;
答案 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中的*
,有两件事需要了解:
这是一项操作。对指针执行*x
取消引用指针。对指针执行**x
可以取消引用指向的指针,依此类推。
这是一种类型。声明int *x
类型意味着它是 int 类型的指针。声明int **x
表示它是指向 int 类型的指针的指针。
示例:
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;
}