【发布时间】:2015-09-22 11:10:29
【问题描述】:
我有这样的结构
struct node
{
int data;
struct node* next;
};
我用它来创建单链表。
我创建了其他功能,例如
int push(struct node* head,int element);
将数据推送到使用节点结构创建的堆栈上。
然后该函数尝试使用代码更新传递给它的struct node* head(它还执行其他操作)
head=(struct node*)malloc(sizeof(struct node));
调用是这样的
struct node* stack;
push(stack,number);
看起来这段代码创建了传递给它的指针的副本。所以我不得不将功能更改为
int push(struct node** head,int element)
和
*head=(struct node*)malloc(sizeof(struct node));
调用是这样的
struct node* stack;
push(&stack,number);
所以我的问题是,早期的功能是做什么的?如果我想更新指针的原始值,是否需要将struct node** 传递给函数或者我的方法是错误的?
抱歉,我不能提供完整的代码,因为它是一个作业。
【问题讨论】:
-
C 按值传递,即使传递的值是对其他东西的引用。
-
@JohnColeman:澄清:C 不支持引用(该术语在编程中具有明确定义的含义)。您的意思可能是“地址”。
-
@Olaf 指针是 C 实现引用的方式。为什么你认为
*被称为dereference 操作符?我不想陷入术语的困境——但是关于计算机科学引用的维基百科文章提到了指针作为引用类型的一个例子:en.wikipedia.org/wiki/Reference_(computer_science)。但是 - 你可能是对的,来自不同语言的人可能会误解我的意思。 -
@JohnColeman:从技术上讲,您是对的:引用是指针。但它本身不是对象。对引用的所有访问实际上都会影响它指向 的对象。 (普通)指针 otoh 是具有类型和值的普通对象。要访问它指向 的对象,您必须应用一个特殊的函数/运算符(在 C 中:解引用运算符),否则您将访问它的值。这种区分很常见,但你说得对,应该有一个更清晰的术语来区分这两个概念。