C语言中两种不同的指针语法,哪一种是正确的,哪一种是';这两者的区别是什么?

C语言中两种不同的指针语法,哪一种是正确的,哪一种是';这两者的区别是什么?,c,pointers,linked-list,double-pointer,C,Pointers,Linked List,Double Pointer,我理解指针的概念,我们在函数中使用指针来优化使用的空间。 我没有得到的是在函数中使用它们时的语法 例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 a

我理解指针的概念,我们在函数中使用指针来优化使用的空间。
我没有得到的是在函数中使用它们时的语法

例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回答后编辑: 为什么我们在链表中这样做呢?如果我们想更改对象的值而不是指针的地址(在这种情况下是双指针),那么它不应该是**头而不是*头吗

根据OP的帖子逐字记录: 例1
*a=+1设置存储在指向
+1
的指针所引用位置的值

示例2
a=+1
使指针指向内存地址1(可能无效)

如果OP表示
a+=1
: 示例1增加存储在指针引用位置的值(因为
*
是解引用运算符)

示例2增加指针本身,使其指向不同的位置,并且增量是指针类型的大小(如果有数组,则很方便)。

根据OP的帖子逐字记录: 例1
*a=+1设置存储在指向
+1
的指针所引用位置的值

示例2
a=+1
使指针指向内存地址1(可能无效)

如果OP表示
a+=1
: 示例1增加存储在指针引用位置的值(因为
*
是解引用运算符)


示例2增加指针本身,使其指向不同的位置,增量是指针类型的大小(如果有数组,则方便)。

如果有
int*p
,则
*p
是指向的值,即
int
<代码>*p+=1
增加
int
。另一方面,
p
本身就是
int*
,指针
p+=1
递增指针,使其指向所指向数组的下一个元素

这应该打印
102035

#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]);
}

head
是指向
struct节点的指针,因此
*head
是指向
struct节点的指针。这就是我们想要存储在链表中的内容,通常是指向下一段数据的指针
**head
将是一个
struct节点
,从该节点分配的元素本身将是一个数据段的副本。

如果您有
int*p
,则
*p
是指向的值,即
int
<代码>*p+=1
增加
int
。另一方面,
p
本身就是
int*
,指针
p+=1
递增指针,使其指向所指向数组的下一个元素

这应该打印
102035

#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]);
}
head
是指向
struct节点的指针,因此
*head
是指向
struct节点的指针。这就是我们想要存储在链表中的内容,通常是指向下一段数据的指针<代码>**head
将是一个
结构节点
,元素本身,从该节点进行赋值将生成数据段的副本

我理解指针的概念,我们在函数中使用指针来优化我们使用的空间

这不是我们使用它们的原因(至少这不是主要原因,在现代系统中,
int*
可能比
int
占用更多空间)-我们使用它们是因为这是向参数写入新值的唯一方法

请记住,C按值传递所有函数参数-函数中形式参数的任何更改都不会反映在函数调用中的参数中。如果你的函数写为

void fun( int a )
{
  a += 1;
}
并称为

fun( b );
b
中的值不会受到影响-
a
是一个完全不同的对象,对它的任何更改都不会反映在
b
中。然而,当我们写作时

void fun( int *a )
{
  *a += 1;
}

fun( &b );
我们不是在更新
a
的值,而是在更新
a
指向的对象的值,在本例中是
b

关于链表示例,它的编写方式不要求
head
成为
struct节点**
,因为它没有得到写入它的新指针值;你需要称之为

list = push( &list, new_value );
struct node *list = NULL;  // list is initially empty

push( &list, 42 );
push( &list, 300 );
以便正确更新列表指针

如果要更新
head
参数,只需将
head
作为
struct节点**
传递,如下所示:

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
  }
}
    
并称之为

list = push( &list, new_value );
struct node *list = NULL;  // list is initially empty

push( &list, 42 );
push( &list, 300 );
等等

我理解指针的概念,我们在函数中使用指针来优化我们使用的空间

这不是我们使用它们的原因(至少这不是主要原因,在现代系统中,
int*
可能比
int
占用更多空间)-我们使用它们是因为这是向参数写入新值的唯一方法

请记住,C按值传递所有函数参数-函数中形式参数的任何更改都不会反映在函数调用中的参数中。如果你的函数写为

void fun( int a )
{
  a += 1;
}
并称为

fun( b );
b
中的值不会受到影响-
a
是一个完全不同的对象,对它的任何更改都不会反映在
b
中。然而,当我们写作时

void fun( int *a )
{
  *a += 1;
}

fun( &b );
我们不是在更新
a
的值,而是在更新
a
指向的对象的值,在本例中是
b

关于链表示例,它的编写方式不要求
head
成为
struct节点**
,因为它没有得到写入它的新指针值;你需要