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

如何解决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} }.

关于链表示例,它的编写方式不需要 bhead,因为它没有写入新的指针值;你需要把它称为

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?