int在C中是可变的。使用指针改变可变对象的值的目的是什么?

int are mutable in C. What is the purpose of using pointer to change the value of mutable object?

谁能解释一下这两者的区别?

#include <stdio.h>
void main() {

int a = 10;
int *p = &a;
*p  = 11;  

}

#include <stdio.h>
void main() {
int a = 10;
a = 11;
}

在这种情况下没什么,但是假设你想调用一个函数,如果想编辑那个函数的 FROM INSIDE 的值,你需要使用指针。

#include <stdio.h>
void set_a(int *p, int val)
{
    *p = val;
}
int main()
{
    int a = 2;
    printf("a is: %d\n", a); // a is 2
    set_a(&a, 5);
    printf("a is: %d\n", a); // a is 5
}

这只是一个用例。例如,在使用堆分配时,您需要使用指针。

两个程序具有相同的可观察效果。

What is the purpose of using pointer to change the value of mutable object?

一个好的用途是能够重用逻辑。一次编写,多次使用

示例:

void foo(int *X, int *Y) {
    /* some complex calculation */
    *X = *X + *Y + 1;
    *Y = *Y + *X + 2;
}

现在,您可以使用该函数对不同变量进行这种“复杂”计算。您只需正确编写和测试一次,然后就可以多次重复使用它。

int main() {
    int a = 10, b = 20, c = 30, d = 40;
    foo(&a, &b);
    foo(&c, &d);
    //...
}

Demo

初学者请注意,根据 C 标准,不带参数的函数 main 应声明为

int main( void )

除了第一个程序中的变量 a 是通过指向它的指针更改的之外,所提供的两个程序实际上是等价的。

如 C 标准中所写(6.2.5 类型,第 #20 页)

... A pointer type describes an object whose value provides a reference to an entity of the referenced type.

这个属性的指针在C中用来实现通过引用函数传递对象的机制。

考虑以下程序。

#include <stdio.h>

void f( int x )
{
    x = 10;
}

void g( int *px )
{
    *px = 10;
}

int main(void) 
{
    int x = 0;
    
    printf( "Before calling f x = %d\n", x );
    f( x );
    printf( "After  calling f x = %d\n", x );

    x = 0;
    
    printf( "\nBefore calling g x = %d\n", x );
    g( &x );
    printf( "After  calling g x = %d\n", x );

    return 0;
}

程序输出为

Before calling f x = 0
After  calling f x = 0

Before calling g x = 0
After  calling g x = 10

正如您在调用函数 f 后看到的,在 main 中声明的变量 x 的值没有改变。问题在于该函数处理在 main 中声明的变量 x 的值的副本。即函数参数是函数的局部变量,由main中声明的变量x的值初始化。更改局部变量不会影响在 main.

中声明的变量 x

但是当变量 x 通过指向它的指针通过引用传递给函数 g 时,函数能够更改在 main 中声明的原始变量 x取消引用传递的指针的方法。

还请记住,当您动态分配内存时,分配的对象没有名称。您只有指向动态分配对象的指针。例如

int *px = malloc( sizeof( int ) );

所以要更改分配的对象,您还需要取消引用指针

*px = 10;