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);
//...
}
初学者请注意,根据 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;
谁能解释一下这两者的区别?
#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);
//...
}
初学者请注意,根据 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;