如何解决C中两种不同的指针语法,哪一种是正确的,两者有什么区别?
我理解指针的概念,并且我们在函数中使用它们来优化我们使用的空间。
我不明白的是在函数中使用它们时的语法。
示例 1:
void fun(int * a)//that means we declared a pointer to an integer type a
{
*a+=1;
}
fun(&b);//calling the function for int b=10;
示例 2:
void fun(int * a)//that means we declared a pointer to an integer type a
{
a+=1;
}
fun(&b);//calling the function for int b=10;
问题:哪个是正确的,如果它们都正确,两者之间有什么区别?
在 AKX 回答后编辑: 为什么我们在链表中这样做呢?如果我们想改变对象的值而不是指针的地址(在这种情况下是双指针),它不应该是**head而不是*head吗?
void push(struct node **head,int data)
{
struct node* newnode = malloc(sizeof(struct node));
newnode->data = data;
newnode->next = *head;
}
push(&head,1);
解决方法
如果您有 int *p
,则 *p
是指向值,即 int
。 *p += 1
增加 int
。另一方面,p
本身是 int *
,指针。 p += 1
递增指针,使其指向它指向的数组的下一个元素。
这应该打印10 20 35
:
#include <stdio.h>
void foo(int *p)
{
p += 1; /* increment the pointer */
*p += 5; /* add to the pointed-to int */
}
int main(void)
{
int a[3] = {10,20,30};
foo(&a[1]); /* address of / pointer to a[1] */
printf("%d %d %d\n",a[0],a[1],a[2]);
}
这里,
struct node* push(struct node **head,int data)
{
struct node* newnode = malloc(sizeof(struct node));
newnode->data = data;
newnode->next = *head;
return newnode;
}
head
是指向 struct node
的指针,所以 *head
是指向 struct node
的指针。这就是我们通常想要存储在链表中的内容,即指向下一段数据的指针。 **head
将是一个 struct node
,元素本身,从中分配将制作数据片段的副本。
我理解指针的概念,并且我们在函数中使用它们来优化我们使用的空间。
这不是我们使用它们的原因(至少这不是主要原因,在现代系统上,int *
可能比 int
占用更多空间)-我们使用它们是因为这是向参数写入新值的唯一方法。
请记住,C 按值传递所有函数参数 - 对函数中形式参数的任何更改都不会反映在函数调用中的参数中。如果你的函数写成
void fun( int a )
{
a += 1;
}
并称为
fun( b );
b
中的值不会受到影响 - a
是一个完全不同的对象,对它的任何更改都不会反映在 b
中。然而,当我们写
void fun( int *a )
{
*a += 1;
}
fun( &b );
我们不更新 a
的值,而是更新 a
指向 的值,在本例中为 {{1} }.
关于链表示例,它的编写方式不需要 b
为 head
,因为它没有写入新的指针值;你需要把它称为
struct node **
为了正确更新列表指针。
如果您想更新 list = push( &list,new_value );
参数,您只需将 head
作为 struct node **
传递,如下所示:
head
并称之为
void push( struct node **head,int data )
{
struct node *n = malloc( sizeof *n );
if ( n )
{
n->data = data;
n->next = *head; // n->next points to the old head of the list
*head = n; // n becomes the new head of the list
}
}
等
,逐字基于 OP 的帖子:
示例 1 *a=+1;
将存储在指针所引用位置的值设置为 +1
。
示例 2 a=+1
使指针指向内存地址 1(可能无效)。
如果 OP 表示 a += 1
:
示例 1 递增存储在指针引用的位置处的值(因为 *
是解引用运算符)。
示例 2 增加指针本身,使其指向不同的位置,并且增量是指针类型的大小(如果您有数组,则很方便)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。