2015-10-16 146 views
0

我对这个简单的C++代码中使用的指针感到困惑。我怀疑是为什么我们没有使用(* ptr)打印字符串而不是(ptr) 。请有人可以帮助我。为什么我们在下面的代码中使用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; 
} 
+3

是什么'ptr1'呢? – Bathsheba

+1

ptr是char *的数组,因此ptr [0] = * ptr和ptr [1] = *(ptr + 1) –

+0

@Bathsheba ptr1无关,我只是用它进行调试,可以评论 – Omkar

回答

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

因此,如果您使用

ptr[0] it will print "OMKAR" 

因为PTR [N]相当于*(PTR + N)

0

ptr[n]相当于*(ptr + n),这已经解除引用。所以ptr[0]返回char *,而不是char **std::ostream很酷,因为它有一个operator<<重载它。

1

因为

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

是相当于

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

@edheal在我的答案你看到一个整数指针? 'x'是整数索引(如问题中的0和1)。 –

+0

@edheal没问题:) –

0

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

当我们想打印char字符串时,只需输入ponter。

0

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

字符*的ptr [3]

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

ptr[1] = "TEXT" 

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

char *var; 
var = "TEXT"; 

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

1

cout考虑了您给它的类型。

还有的cout许多不同的重载,此相关的是charchar *和PTR这实在是char **ptr

在你的榜样,你有以下数据类型

  • PTR - 字符* PTR 3 - 衰减到char ** ptr(Array-to-pointer decay
  • ptr [x] - 它是*(ptr + x)或char *
  • * pt [R [X] - 是**(PTR + x)或炭

要了解各后续的行确实

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] - >char(炭)
的ptr [0] - >char *(字符指针)
PTR - >char **(指向字符指针)

现在ADL找到最专门版本,并使用该

  • char是不是一个void *
  • char是不是一个char *
  • 字符是一个char

  • 字符*可能是一个void * // Implicit conversions

  • 字符*是一个char *
  • 比无效*
  • 字符*更专门的是不是一个字符
  • 所以字符*选择其专门版本

  • 字符**可能是一个void * //隐式转换

  • 字符**不是一个char *
  • 字符**不是一个char
  • 使字符**使用无效*

所以他们写出来

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

非常深刻的解释..但我需要一些时间来清楚地掌握你的答案 – Omkar

相关问题