【问题标题】:Char pointers vs Int pointers passed to functions传递给函数的 Char 指针与 Int 指针
【发布时间】:2013-12-06 13:43:09
【问题描述】:

我以为我理解了指针,但我认为它们被区别对待的方式存在细微差别,我并没有完全理解。当我将整数指针或整数地址传递给 showInt 时,它将打印出与函数外部相同的内存地址。然而。当我将以下指针传递给 showChar 时;

char* value = "One";
showChar(value);

函数内部的第一个元素的地址与函数外部的地址不同。我知道这是与按值传递一致的行为,并且指针的副本是在函数内制作的,但是我的印象是指针的副本仍然具有相同的地址。为什么在处理指向 char 的指针时会有所不同?如果 char 指针只是存储字符串字面量的第一个元素的地址,那么为什么函数中的指针不指向相同的内存位置,而是指向内存中的新区域?这表明它不是复制 char 指针,而是创建一个新的 char 指针并将其分配给原始指针指向的值。如果是这样,我不明白为什么。

我知道您可以通过传递指向指针或引用指向指针来访问函数中的指针地址,但为什么会这样仍然让我感到困惑。

传递一个指向 char 的指针;

void showChar(char* name){

 cout << name << endl;
 cout << &name << endl;
}

传递指向 int 的指针;

void showInt(int* num){

 cout << num << endl;
 cout << *num << endl;
}

【问题讨论】:

  • 请注意,char* value = "One"; 是 C++ 中不推荐使用的转换
  • char* name 在堆栈上,所以当你得到它的地址时,它是一个不同的地址,就像&amp;num 会给你一个不同的值一样。我认为如果您使用cout &lt;&lt; (void*) name &lt;&lt; endl;,您将获得相同的价值。
  • @leemes;我知道 char* value = "One" 和 char value[] = "One" 之间存在差异。我只是想了解行为的差异,以及为什么指向字符数组的指针行为不同。
  • @MartynShutt,leemes 的意思是,你应该在指针前加上const,因为"One" 可以由const char * 指向,而不是char *。跨度>
  • @Shahba;因为我正在初始化指向字符串文字的指针?

标签: c++ function pointers char


【解决方案1】:

showChar中的第一行:

    cout << name << endl;

将打印指针 name 后面的 内容,因为 C++ 中的 IO 流运算符被重载以将字符指针打印为文本而不是将指针打印为数字。

在这个函数的第二行

    cout << &name << endl;

您不打印指针地址name,而是打印局部变量name(恰好是指针类型)的指针(地址)。这是一次太多的参考。你想要的是改变 operator&lt;&lt;(ostream &amp;, char*) 工作方式的行为,即打印指针地址而不是打印 C 字符串。

您可以通过在将指针传递给cout 之前简单地转换指针来做到这一点,如下所示:

void showChar(char* name){
    cout << (void*)name << endl;
}

【讨论】:

  • 感谢您的解释。我已经标记了您的答案,因为这也回答了我的问题。不幸的是,我只能接受一个答案,但是您的答案也很清楚地解释了我哪里出错了。
【解决方案2】:

您的 showCharshowInt 函数正在打印不同的内容。

showChar,这个:

cout << &name << endl;

打印name 的地址,这是一个局部变量。在showInt 中,您不打印&amp;num 的值;而是打印num,这是一个地址,但不是局部变量的地址。

showChar中,如果你想打印name的值作为地址,你需要把它转换成其他指针类型,比如void*

cout << (void*)name << endl;

因为operator&lt;&lt;char* 的重载会取消引用char* 指针并打印它指向的C 样式字符串。

更详细的:

void showChar(char* name){
 cout << name << endl;    // prints the contents of the string that
                          // `name` points to
 cout << &name << endl;   // prints the address of the local variable `name`
}

void showInt(int* num){
 cout << num << endl;     // prints the value of the pointer `num`
 cout << *num << endl;    // prints the value of the `int` object that
                          // `num` points to
}

【讨论】:

  • 啊。因此,这不是行为上的差异,而是与
  • @MartynShutt:特殊行为仅适用于指针参数。您不能将数组作为参数传递给operator&lt;&lt;。在大多数情况下,数组类型的表达式被隐式转换为指向其第一个元素的指针。 (例外情况包括&amp;arrsizeof arr。)将char* 传递给cout &lt;&lt; ... 会使其假定char* 指向C 样式字符串的第一个字符。
  • 我明白了。这完全符合我对指针行为的期望。我开始认为我完全误解了他们的行为。谢谢。
猜你喜欢
  • 2021-09-07
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2017-09-03
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多