为什么我们在下面的代码中使用了ptr而不是* ptr

时间:2015-10-16 11:37:08

标签: c++ pointers

我对这个简单的c ++代码中使用的指针感到困惑。我怀疑为什么我们没有使用(* ptr)来打印字符串而不是(ptr)。请有人帮帮我。

#include<iostream>
using namespace std;
int main()
{
  char *ptr[3];
  ptr[0]="OMKAR";
  ptr[1]="GURAV";
  //char *ptr1="HELLO";
  cout<<"Contents of ptr[0]:"<<ptr[0]<<endl;
  cout<<"Contents of ptr[1]:"<<ptr[1]<<endl;
}

6 个答案:

答案 0 :(得分:2)

*ptr[0] will print only the first character ie "O"

所以,如果你使用

ptr[0] it will print "OMKAR"

因为ptr [n]相当于*(ptr + n)

答案 1 :(得分:1)

因为

int x;
...
ptr[x]=...;

相当于

int x;
...
*(ptr+x)=...;

答案 2 :(得分:1)

cout考虑了你给它的类型。

cout有许多不同的重载,这里的相关内容是charchar *和ptr,它真的是char **ptr

在您的示例中,您有以下数据类型

  • ptr - char * ptr 3 - 衰败到char ** ptr(Array-to-pointer decay
  • ptr [x] - *(ptr + x)或char *
  • * ptr [x] - **(ptr + x)或char

找出每个后续行的内容

std::cout<<"Contents of *ptr[0]:"<<*ptr[0]<<std::endl;
std::cout<<"Contents of ptr[0] :"<<ptr[0]<<std::endl;
std::cout<<"Contents of ptr    :"<<ptr<<std::endl;

cout被定义为类似的东西时(非常简化)

class ostream {
    public:
    ostream& operator<< (const void *);
    ostream& operator<< (const char *);
    ostream& operator<< (const char);
};
ostream cout;

使用ADL(Argument-Dependent Lookup) or König Lookup我们首先需要找到类型

* ptr [0] - &gt; char(char)
ptr [0] - &gt; char *(指向char的指针)
ptr - &gt; char **(指向char的指针)

现在ADL找到最专业的版本并使用

  • char不是空白*
  • char不是char *
  • char是一个char

  • char *可以是void * // Implicit conversions

  • char *是char *
  • 比void *
  • 更专业
  • char *不是字符
  • 所以char *选择其专用版

  • char **可能是空的* //隐式转换

  • char **不是char *
  • char **不是char
  • 所以char **使用void *

所以他们最终写作

Contents of *ptr[0]:O
Contents of ptr[0] :OMKAR
Contents of ptr    :0x27fe00

答案 3 :(得分:0)

ptr[n]相当于*(ptr + n),已被解除引用。因此,ptr[0]会返回char *,而不是char **std::ostream很酷,因为它已经为operator<<重载了。

答案 4 :(得分:0)

这很简单。 char *ptr[3];有一个包含三个指针的数组。 ptr[0]="OMKAR";第一个指向“OMKAR”,第二个指针ptr[1]指向“GURAV”......

当我们想要打印char字符串时,只需要cout the ponter。

答案 5 :(得分:0)

请原谅格式化,因为我在手机上。

  

char * ptr [3]

是一个指针数组。所以当你这样做时

anonymous

它将指针设置为字符串文字“TEXT”存储在程序中的地址。 这有点像做

 ptr[1] = "TEXT"

它只是一个包含指向char的指针的数组,换句话说,是一个字符串数组。