C 使用函数递增

C 使用函数递增,c,function,pointers,increment,C,Function,Pointers,Increment,我想用C中的函数来增加整数的值 首先我写了一个函数inc,其中我增加了整数v的值。然后在main函数中,我声明了一个新变量a,并使用inca函数递增 这是我的密码: #include<stdio.h> void inc(int v) { v++; } int main() { int a; scanf("%d",&a); inc(a); printf("%d",a); return 0;

我想用C中的函数来增加整数的值

首先我写了一个函数inc,其中我增加了整数v的值。然后在main函数中,我声明了一个新变量a,并使用inca函数递增

这是我的密码:

#include<stdio.h>
void inc(int v)
{
    v++;
}
int main()
{
    int a;
    scanf("%d",&a);
    inc(a);
    printf("%d",a);
    return 0;
}
但输出值与输入值相同。它不是递增的

i、 e如果输入值为45,则期望值为46作为输出。但产量仍然是45。我哪里做错了?请有人解释一下

所以我做了一些研究,发现当使用指针时,预期的答案就会出现,下面是代码

#include<stdio.h>
void inc(int *v) {
    (*v)++;
}

int main() {
    int a;
    scanf("%d", &a);
    inc(&a);
    printf("%d", a);
    return 0;
}  
为什么没有指针的方法是不正确的

同样在第二种方法中,为什么我们要将参数作为地址传递,即e&a。为什么我们不能把它作为一个


我是C的新手。所以请帮我解答我的疑问

您总是将变量、值或引用的副本传递给函数。因此,发送值的副本不会影响主函数。但是,发送其引用的副本将影响主函数,因为您可以说出变量在内存中的位置。

您总是将变量、值或引用的副本传递给函数。因此,发送值的副本不会影响主函数。但是,发送其引用的副本将影响主函数,因为您可以说出变量在内存中的位置

同样在第二种方法中,为什么我们要将参数作为地址传递,即e&a。为什么我们不能把它作为一个

这里使用指针进行操作,当您将address的值更改为该指针时,原始值也会更改

另一方面,当您通过值传递变量时,它只会复制并在函数调用中增加它,原始值不会发生任何更改。第一个方法不起作用,因为函数中传递的变量是按值传递的类型

<>编辑:这个问题现在只在C.中被标记,但是为了额外的信息,有一种方法在C++中没有指针,它被称为通过引用操作,它可以用函数签名上的符号和符号来表示变量的原始拷贝,例如:

void changeRealValue(int& value) {
// _____________________^________
    value++; // original value is incremented now
}
同样在第二种方法中,为什么我们要将参数作为地址传递,即e&a。为什么我们不能把它作为一个

这里使用指针进行操作,当您将address的值更改为该指针时,原始值也会更改

另一方面,当您通过值传递变量时,它只会复制并在函数调用中增加它,原始值不会发生任何更改。第一个方法不起作用,因为函数中传递的变量是按值传递的类型

<>编辑:这个问题现在只在C.中被标记,但是为了额外的信息,有一种方法在C++中没有指针,它被称为通过引用操作,它可以用函数签名上的符号和符号来表示变量的原始拷贝,例如:

void changeRealValue(int& value) {
// _____________________^________
    value++; // original value is incremented now
}
指针是包含对象地址的变量。指针不携带有关对象内容的信息,但包含有关对象所在位置的信息

指针在C编程中被广泛使用。 在处理数组时经常使用指针

计算机内存可以被认为是一个编号的单字节单元序列,可以单独或分块访问

内存中的每个变量都有自己的地址—它所在的第一个单元格的编号及其值。指针也是在内存中分配的变量。它还有一个地址,它的值是其他变量的地址。对于32位版本的编译器,声明为指针的变量在RAM中占用4个字节

与任何变量一样,指针也必须声明

看看这个例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int a, *b;
  system("chcp 1251");
  system("cls");
  a = 134;
  b = &a;
  // %x = display the number in hexadecimal form
  printf("\n The value of the variable a is %d = %x hex.", a,a);
  printf("\n The address of the variable a is %x hex.", &a);
  printf("\n Data at pointer address b are equal %d = %x hex.", *b,*b);
  printf("\n The value of b pointer is %x hex.", b);
  printf("\n Location address of pointer b is %x hex.", &b);
  getchar();
  return 0;
}
指针是包含对象地址的变量。指针不携带有关对象内容的信息,但包含有关对象所在位置的信息

指针在C编程中被广泛使用。 在处理数组时经常使用指针

计算机内存可以被认为是一个编号的单字节单元序列,可以单独或分块访问

内存中的每个变量都有自己的地址—它所在的第一个单元格的编号及其值。指针也是在内存中分配的变量。它还有一个地址,它的值是其他变量的地址。对于32位版本的编译器,声明为指针的变量在RAM中占用4个字节

与任何变量一样,指针也必须声明

看看这个例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int a, *b;
  system("chcp 1251");
  system("cls");
  a = 134;
  b = &a;
  // %x = display the number in hexadecimal form
  printf("\n The value of the variable a is %d = %x hex.", a,a);
  printf("\n The address of the variable a is %x hex.", &a);
  printf("\n Data at pointer address b are equal %d = %x hex.", *b,*b);
  printf("\n The value of b pointer is %x hex.", b);
  printf("\n Location address of pointer b is %x hex.", &b);
  getchar();
  return 0;
}

问题是,默认情况下,c对函数使用传递值。这意味着如果您在main中以以下方式调用函数

int a = 45;
inc(a);
th 函数只知道值45,而不知道变量a。因此,在您的示例中,它将生成一个新的局部变量int v,该变量存储值45并递增。由于函数不知道a的任何信息,特别是不知道a在内存中的位置,因此无法修改它。通常有两种解决方法:

使用返回: 在这种情况下,函数将使用传递的参数值继续操作本地副本。最后,它可以返回所需的函数输出。这将通过以下方式实施:

#include<stdio.h>
void inc(int v)
{
    v++;
    return v
}

int main()
{
    int a;
    scanf("%d",&a);
    a = inc(a);
    printf("%d",a);
    return 0;
}
将参数作为指针传递: 在第二种情况下,你已经发现,你通过引用传递你的论点。通过这种方式,函数可以知道的内存地址,因此可以直接操作存储在的值。函数定义void incent*v中v旁边的小星形图标定义函数以地址作为输入。因此,您必须使用&a传递a的地址,就像您发布的代码中所做的那样

总结:


根据您的需要,您的函数或您将来实现的任何函数都可以是上述两种类型之一。但是,作为一个指导原则,它永远不要在传递的地址上操作值,同时返回一些内容。这可能会导致混淆,并导致代码一般可读性较差。

问题在于默认情况下c对函数使用传递值。这意味着如果您在main中以以下方式调用函数

int a = 45;
inc(a);
函数只知道值45,而不知道变量a。因此,在您的示例中,它将生成一个新的局部变量int v,该变量存储值45并递增。由于函数不知道a的任何信息,特别是不知道a在内存中的位置,因此无法修改它。通常有两种解决方法:

使用返回: 在这种情况下,函数将使用传递的参数值继续操作本地副本。最后,它可以返回所需的函数输出。这将通过以下方式实施:

#include<stdio.h>
void inc(int v)
{
    v++;
    return v
}

int main()
{
    int a;
    scanf("%d",&a);
    a = inc(a);
    printf("%d",a);
    return 0;
}
将参数作为指针传递: 在第二种情况下,你已经发现,你通过引用传递你的论点。通过这种方式,函数可以知道的内存地址,因此可以直接操作存储在的值。函数定义void incent*v中v旁边的小星形图标定义函数以地址作为输入。因此,您必须使用&a传递a的地址,就像您发布的代码中所做的那样

总结:

根据您的需要,您的函数或您将来实现的任何函数都可以是上述两种类型之一。但是,作为一个指导原则,它永远不要在传递的地址上操作值,同时返回一些内容。这通常会导致混淆,并导致可读性较差的代码

为什么没有指针的方法不正确

如果使用指针参数,您的目的是指向调用者中的对象。然后可以在调用的函数中修改此对象。这就是所谓的按引用传递。将引用传递给调用方中的对象

如果不使用指针,只需将变量的值按值传递给函数,这意味着参数的值被分配给函数局部变量。在函数内部,您只能修改此函数局部变量的值,但不能修改调用者中的对象

同样在第二种方法中,为什么我们要将参数作为地址传递,即e&a。为什么我们不能把它作为一个

在这种情况下,&运算符获得需要分配给指针参数的a的地址

指针始终存储指向的对象的地址,而不是指向的对象的值

如果没有地址,指针不表示对象

请学习更多关于指针的知识,并阅读一本好的C入门书,就像你可以在那里免费得到一本一样

您还可以在此处找到此文件和其他文件:

通常在前几章中解释函数和参数传递

为什么没有指针的方法不正确

如果使用指针参数,您的目的是指向调用者中的对象。然后可以在调用的函数中修改此对象。这就是所谓的按引用传递。将引用传递给调用方中的对象

如果不使用指针,只需将变量的值按值传递给函数,这意味着参数的值被分配给函数局部变量。在函数内部,您只能修改此函数局部变量的值,但不能修改调用者中的对象

同样在第二种方法中,为什么我们要将参数作为地址传递,即e&a。为什么我们不能把它作为一个

在这种情况下,&运算符获得需要分配给指针参数的a的地址

指针总是存储ob的地址 对象指向,而不是指向对象的值

如果没有地址,指针不表示对象

请学习更多关于指针的知识,并阅读一本好的C入门书,就像你可以在那里免费得到一本一样

您还可以在此处找到此文件和其他文件:

通常在前几章中解释函数和参数传递。

简短回答:

C是默认的传递值。如果未指定指针,则inc中的v只是具有相同值的in main的副本

也就是说,v++会在inc的范围内增加v,但不会影响其他

对于指针,*v++意味着在v指向的位置添加一个值

如果使用C++,引用引用是另一种解决方案。

简短回答:

C是默认的传递值。如果未指定指针,则inc中的v只是具有相同值的in main的副本

也就是说,v++会在inc的范围内增加v,但不会影响其他

对于指针,*v++意味着在v指向的位置添加一个值


如果你使用C++,引用的方式是另一种解决方案。

你需要一本C的书。C简短答案:C是默认的逐值。如果未指定指针,则inc中的v只是具有相同值的in main的副本。也就是说,v++会在inc的范围内增加v,但不会影响其他。对于指针,*V++意味着在V点到C的位置加一个值。C和C++是非常不同的,但类似的语言。我建议你不要试图同时学习两者。先学习其中一个,当你开始学习另一个时,准备好忘记其中的一部分。你可能想阅读一下将参数传递给函数的方法:按值传递和按引用传递。这是否回答了你的问题@Roberts SupportsMonicacellio我认为没有,因为OP似乎完全了解那些语言不可知的概念,只是不知道C支持或不支持它的方式/原因。你需要一本C的书。简短的回答:C是默认的传递值。如果未指定指针,则inc中的v只是具有相同值的in main的副本。也就是说,v++会在inc的范围内增加v,但不会影响其他。对于指针,*V++意味着在V点到C的位置加一个值。C和C++是非常不同的,但类似的语言。我建议你不要试图同时学习两者。先学习其中一个,当你开始学习另一个时,准备好忘记其中的一部分。你可能想阅读一下将参数传递给函数的方法:按值传递和按引用传递。这是否回答了你的问题@Roberts支持Smonicacellio我认为不是,因为OP似乎完全了解那些语言不可知论的概念,只是不知道C如何/为什么支持或不支持它。