【问题标题】:How to manipulate variable in function?如何在函数中操作变量?
【发布时间】:2017-05-31 15:59:20
【问题描述】:

在下面的示例中,我将 char 作为指针传递给函数。当函数打印出char的内存地址时,它是一个不同的地址。在这种情况下,我是否处理两个不同的变量?这不是和我没有在函数参数中使用指针一样的结果吗(与按值传递相同)?

char a = 'a';
printf("a=%p\n", &a);
showString(a);

//function 
void showString(char *c){
  c='b';
  printf("c=%p\n", &c);
}

c 被赋值为“b”。但是如果我在函数调用后检查a,它仍然有值'a'。上述需要如何更改,以便函数中分配的值在函数之外继承?

【问题讨论】:

  • 您正在打印a地址,但您正在将其传递给您的函数。顺便说一句,您的编译器应该警告您有关隐式整数到指针的转换;如果不是,则调高警告级别。
  • "当函数打印出 char 的内存地址时,," ---> 函数试图打印char * 的地址,而不是char 的地址。
  • 已经有一个关于这个主题的线程可以帮助你。 stackoverflow.com/questions/14331411/passing-char-pointer-in-c
  • * 替换为&,您尝试使用的语法就是如果您使用C++,引用将如何工作。但你不是:你正在使用 C 和指针。因此,必须使用地址和取消引用运算符。

标签: c pointers


【解决方案1】:

您没有正确使用指针:您没有为指针指向的对象分配新值,而是分配了指针本身。

调用应该使用address-of操作符,赋值应该使用dereference操作符:

showString(&a);
printf("a=%p\n", (void*)&a);
...
void showString(char *c){
    *c='b';
    printf("c=%p\n", (void*)c);
}

现在两个打印输出将产生相同的地址,调用函数中char a的值应该改变。

注 1: 编译器允许 c = 'b' 赋值的原因有些奇怪:'b' 被认为是字符常量,char 被认为是整数类型,而 C 允许你分配整数指向假设您比编译器更了解自己在做什么的指针。

注意 2: 当您打印带有%p 的指针,并且指针类型既不是void* 也不是char*,则需要强制转换为void*。你正在打印char*,所以它可以不用演员表,但我还是添加了演员表,以防你想用不同类型的指针来试试这个。

【讨论】:

  • 它们没有传递指针,而是传递char的值。
  • 是的,但这不是一个完整的解决方案,因为 OP 在他的函数调用中也有错误。
  • @JohnBollinger 啊,你是对的,我完全错过了。非常感谢!
  • "你正在打印char*,所以它可以不用演员表,'嗯,虽然有点迂腐,char * 不需要与void * 具有相同的宽度/布局。高度可移植代码需要void * 演员才能与"%p" 一起使用。
  • @chux 在 C99 标准 6.2.5 第 27 部分中,它说“指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。”这就是为什么我认为编译器不会抱怨。
【解决方案2】:

你的函数应该是这样的

//function 
void showString(char *c) {
    *c = 'b';
    printf("c=%p\n", &c); //<---to print the address of C
    printf("c=%c\n", *c);  //<---to print the value that C is pointing
}

当你调用它时,你应该传递 a

的地址
char a = 'a';
printf("a=%p\n", &a);
showString(&a);   //<---&a and not a

【讨论】:

  • 嗯:printf("c=%p\n", &amp;c); ?你想打印c的地址吗?
  • 还要注意,如果对printf() 的调用应该产生相同的输出,那么函数showString() 中的一个应该打印c&amp;c
  • 谢谢。在函数内部,c 的内存地址与函数外部不同。但是我看到对变量的函数更改在函数之外。这怎么可能,因为在函数内部,变量有不同的内存地址?
  • @4thSpace pointer 位于不同的地址,因为您通过值(即复制)传递 pointer。两个指针,无论它们自己位于何处,都在各自的位置保存相同的值,并且该值是相同char 的地址。
  • 尚不清楚的是输出是"c=some_address\n""c=b\n",但在这两种情况下,两者都不正确,因为c 是一个指针,没有&amp;c 的值,也没有@ 987654335@,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
相关资源
最近更新 更多