更改C中变量的值

更改C中变量的值,c,pointers,C,Pointers,为什么要更改主变量的值而不是变量的副本 我有办法 int plusInt(int x){ return ++x; } 调用此函数时,将创建一个新的堆栈帧,其中包含x的副本,而不是原始变量。这会改变副本的值吗 问:如果我想更改原始变量的值,我会使用指向它的指针,然后增加一个值,对吗?例如: int plusIntPointer(int *x){ return ++*x; } 但是有什么用/为什么有人想要更改原始变量的值而不是副本 这会改变副本的值吗 确切地说,函数只有副本,而不是原始变

为什么要更改主变量的值而不是变量的副本

我有办法

int plusInt(int x){
 return ++x; 
}
调用此函数时,将创建一个新的堆栈帧,其中包含x的副本,而不是原始变量。这会改变副本的值吗

问:如果我想更改原始变量的值,我会使用指向它的指针,然后增加一个值,对吗?例如:

int plusIntPointer(int *x){
 return ++*x; 
}
但是有什么用/为什么有人想要更改原始变量的值而不是副本

这会改变副本的值吗

确切地说,函数只有副本,而不是原始变量作为局部变量

如果我想更改原始变量的值,我会使用指向它的指针,然后增加一个值,对吗

又对了。使用指针的原因是将变量的地址传递给函数

但是有什么用/为什么有人想要更改原始变量的值而不是副本

原因是在函数结束并返回调用函数后,对副本的任何更改都将丢失

例如,假设您想使用一个函数来交换两个变量的值。然后,您必须更改原始值。您的函数应该如下所示:

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = *temp;
}
swap(&a, &b);
你应该这样称呼它:

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = *temp;
}
swap(&a, &b);
这样,即使返回到调用函数,更改也将保持不变。 如果您只是更改副本,当您返回调用函数时,变量将不会有交换值

这会改变副本的值吗

确切地说,函数只有副本,而不是原始变量作为局部变量

如果我想更改原始变量的值,我会使用指向它的指针,然后增加一个值,对吗

又对了。使用指针的原因是将变量的地址传递给函数

但是有什么用/为什么有人想要更改原始变量的值而不是副本

原因是在函数结束并返回调用函数后,对副本的任何更改都将丢失

例如,假设您想使用一个函数来交换两个变量的值。然后,您必须更改原始值。您的函数应该如下所示:

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = *temp;
}
swap(&a, &b);
你应该这样称呼它:

void swap(int *x, int *y)
{
    int temp = *x;
    *x = *y;
    *y = *temp;
}
swap(&a, &b);
这样,即使返回到调用函数,更改也将保持不变。 如果您只是更改副本,当您返回调用函数时,变量将不会有交换值

这会改变副本的值吗

对。仅限plusInt本地的副本

如果我想更改原始变量的值,我会使用指向它的指针,然后增加一个值,对吗

对。要在另一个作用域中更改变量,我们必须执行间接寻址。这是通过传递变量地址来实现的

但是有什么用/为什么有人想要更改原始变量的值而不是副本

在学习编程的早期遇到的最简单的用例是在尝试将节点插入链表的头部时。添加函数必须修改调用上下文中的结构

也许这不是最简单的。考虑这个函数

void swap_ints(int l, int r) {
  int t = l; l = r; r = t;
}

int main(void) {
  int x = 1, y = 2;
  swap_ints(x, y);
  // Were they swapped?
}
这会改变副本的值吗

对。仅限plusInt本地的副本

如果我想更改原始变量的值,我会使用指向它的指针,然后增加一个值,对吗

对。要在另一个作用域中更改变量,我们必须执行间接寻址。这是通过传递变量地址来实现的

但是有什么用/为什么有人想要更改原始变量的值而不是副本

在学习编程的早期遇到的最简单的用例是在尝试将节点插入链表的头部时。添加函数必须修改调用上下文中的结构

也许这不是最简单的。考虑这个函数

void swap_ints(int l, int r) {
  int t = l; l = r; r = t;
}

int main(void) {
  int x = 1, y = 2;
  swap_ints(x, y);
  // Were they swapped?
}

假设你想做一个交换两个变量的函数。然后,您需要执行以下操作:

void swap(int *a, int *b)
{
  int temp = *a;
  *a = *b;
  *b = *temp;
}
...
void swapwrong(int a, int b)  // wont work as intended
{
  int temp = a;
  a = b;
  b = temp;
}
...
int a = 1, b = 2 ;
swap(&a, &b);
printf ("after swap : a=%d b=%d\n", a,b);
swapwrong(&a, &b);
printf ("after swapwrong : a=%d b=%d\n", a,b);
这会打印出来

after swap : a=2 b=1
after swapwrong : a=2 b=1

假设你想做一个交换两个变量的函数。然后,您需要执行以下操作:

void swap(int *a, int *b)
{
  int temp = *a;
  *a = *b;
  *b = *temp;
}
...
void swapwrong(int a, int b)  // wont work as intended
{
  int temp = a;
  a = b;
  b = temp;
}
...
int a = 1, b = 2 ;
swap(&a, &b);
printf ("after swap : a=%d b=%d\n", a,b);
swapwrong(&a, &b);
printf ("after swapwrong : a=%d b=%d\n", a,b);
这会打印出来

after swap : a=2 b=1
after swapwrong : a=2 b=1
但是有什么用/为什么有人想改变 原始变量而不是副本

您可以更改copy变量,但当代码退出函数时,此变量将不可用

此外,我们通常不会仅仅为了进行简单的增量而调用函数。代码

int plusInt(int x){
 return ++x; 
}
完全可以代替

x++ 
而不是调用函数。在优化模式下,编译器可能会决定通过排列代码想要做的更改来摆脱此函数

我们在许多情况下使用复制变量,例如显示变量的值或在y 你不想反映任何意外的变化

但是有什么用/为什么有人想改变 原始变量而不是副本

您可以更改copy变量,但当代码退出函数时,此变量将不可用

此外,我们通常不会仅仅为了进行简单的增量而调用函数。代码

int plusInt(int x){
 return ++x; 
}
完全可以代替

x++ 
而不是调用函数。在优化模式下,编译器可能会决定通过排列代码想要做的更改来摆脱此函数


在许多情况下,我们使用复制变量,例如显示变量的值或在不希望反映任何意外更改的位置

通过指针将参数传递给函数的应用很多。例如:

如前所述,将参数传递给函数时,会在堆栈中分配一个空间,并将此类参数复制到此空间。此操作可能是昂贵的,因此您可以考虑通过指针传递这些参数。然后,指向数据的指针将传递给函数,即复制到堆栈。在这种情况下,您可以考虑将这些参数设置为const,以防止其值的意外改变,如通常使用char *./p>所做的那样。 有时您实际上需要更改此类参数的值。请注意,这将在适当的地方完成。也就是说,不会有复制操作。在修改后的示例中,我们可能需要执行以下操作:

void increment(int* i)
{
  if(i)
    ++*i;
}
在本例中,对于函数的结果,对于输入参数没有任何复制操作。此外,如您所见,我们可以将NULL作为i的值传递。函数的算法可能会以不同的方式处理这种情况,例如跳过此参数等


当您需要在一个函数中更改多个参数的值时,建议使用此参数传递方法。

通过指针向函数传递参数有许多应用。例如:

如前所述,将参数传递给函数时,会在堆栈中分配一个空间,并将此类参数复制到此空间。此操作可能是昂贵的,因此您可以考虑通过指针传递这些参数。然后,指向数据的指针将传递给函数,即复制到堆栈。在这种情况下,您可以考虑将这些参数设置为const,以防止其值的意外改变,如通常使用char *./p>所做的那样。 有时您实际上需要更改此类参数的值。请注意,这将在适当的地方完成。也就是说,不会有复制操作。在修改后的示例中,我们可能需要执行以下操作:

void increment(int* i)
{
  if(i)
    ++*i;
}
在本例中,对于函数的结果,对于输入参数没有任何复制操作。此外,如您所见,我们可以将NULL作为i的值传递。函数的算法可能会以不同的方式处理这种情况,例如跳过此参数等


当您需要在一个函数中更改多个参数的值时,使用此参数传递方法本身就是一种建议。

没有看到您使用swap添加了答案。投票吧!没有看到你用swap添加了答案。投票吧!在您的示例中:++*x注意C中运算符的优先级。建议将该表达式写成:++*xin您的示例:++*x注意C中运算符的优先级。建议将该表达式写成:++*x