我是一般编程的初学者,但我最近正在尝试学习 C。
当我阅读 cprogramming.com 上的指针时,我看到类似这样的内容:
int *ptr = malloc( sizeof(*ptr) );
因此,如果我理解正确的话,这会创建一个指针并使其指向一个整数大小的内存地址。
在同一个网站上,在二叉树示例 ( http://www.cprogramming.com/tutorial/c/lesson18.html ) 中,显示了这一行:
*leaf = (struct node*) malloc( sizeof( struct node ) );
据我所知,指针部分并未解释此语法。这实际上是一样的吗?:
struct node *leaf = malloc(sizeof(struct node));
您可能必须转到链接才能查看它的来源,但主要问题是:
第二行是否等同于第一行,如果是,为什么有两种方法可以做同样的事情?如果不是,是什么让它与众不同?
编辑:来自网站的行的来源:
struct node
{
int key_value;
struct node *left;
struct node *right;
};
和
insert(int key, struct node **leaf)
{
if( *leaf == 0 )
{
*leaf = (struct node*) malloc( sizeof( struct node ) );
(*leaf)->key_value = key;
/* initialize the children to null */
(*leaf)->left = 0;
(*leaf)->right = 0;
}
else if(key < (*leaf)->key_value)
{
insert( key, &(*leaf)->left );
}
else if(key > (*leaf)->key_value)
{
insert( key, &(*leaf)->right );
}
}
最佳答案
请注意,第 18 课中的那行来自不同的上下文:
insert(int key, struct node **leaf)
{
if (*leaf == 0)
{
*leaf = (struct node*) malloc(sizeof(struct node));
作者应该被枪击,因为他写了不能在 C99 下编译的代码而忏悔;函数没有返回类型,函数中也没有返回语句。那是真正的老派编程风格(1989 年之前的老派)。该函数被隐式声明为返回类型 int
,但实际上不返回任何值。这在 C89 中是允许的,但即使在当时也是过时的。该函数的返回类型应为 void
因为它不返回任何值。
还要注意——而且更切合你的问题——变量 leaf
是 struct node **
或双指针。因此*leaf
是 struct node *
.
这与代码不同:
struct node *leaf = malloc(sizeof(struct node));
在这里,leaf
是一个指针——*
是指定类型是指针类型的声明符的一部分,而在前面的示例中,它是一元 *
取消引用运算符。
使用这样的符号有以下优点:
int *ptr = malloc(20 * sizeof(*ptr));
请注意,*
有三种不同的用途在那一行代码中。第一个*
表示 ptr
的类型是一个指针(指向 int
)。第二个是二元乘法运算符;第三个又是一元取消引用运算符。自 ptr
是指向 int
的指针, *ptr
是一个 int
, 并且分配足够大,可以容纳 20 个 int
的数组值。请注意,如果我将行更改为:
double *ptr = malloc(20 * sizeof(*ptr));
我只改了字int
进入double
, 但现在代码为 20 double
的数组分配了足够的空间值。更改 double
至 struct node
并且它为 20 struct node
的数组分配了足够的空间值。相比之下,如果代码最初是:
int *ptr = malloc(20 * sizeof(int));
然后有两个词要改变,让它分配一个double
的数组。或 struct node
的数组.
Actor malloc()
是有争议的。在纯 C 中,这是不必要的。在 C++ 中,这是至关重要的。在malloc()
面前写类型转换的人有很多人会痛斥C 中的等人。我在一个需要强制转换的系统上学习了 C,即使正确声明了 malloc()
(当时是 char *malloc();
,并且没有 <stdlib.h>
可以再声明五年或更长时间;这可以告诉您这是多久以前的事了),所以我仍在使用它。在过去 20 年中学习 C 编程的大多数人都不使用强制转换 — 除非他们的代码也需要由 C++ 编译器编译。 (我的 C 代码可由 C++ 编译器编译,尽管我通常只将它用作 C 代码。)就此而言,您将付钱并选择。
关于c - C中用于内存分配/指针的星号定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25756604/