C++中,关于定义一个字符指针数组,如何去输出所对应的字符串的问题。图一题目,图2我的疑惑.

如题所述

第1个回答  2016-12-07
1、首先name[i]是一个指向字符型的指针,按照图一的定义:
char *name[0]="BASIC"; //试想一下char *c="BASIC";
char *name[1]="FORTRAN";
这样想输出BASIC就应该是:
cout<<name[i]; //同cout<<c; 输出首字母指针会输出整个串的值。

2、如果照你说的做,例如:
cout<<*name[0];
这个name[0]是首字母地址吧,*name[0]不应该是首字母地址里面存的值吗,把这个输出会输出什么呀?当然是串的首字母啦,此处也就是B。像你这样输出整个串,需要一个循环:
for(int i=0;i<5;i++)
{
cout<<*(name[0]+i); //指针往后移一个单位

}
这样循环完成后也会输出BASIC,也就等同于:cout<<name[0];追问

如果我输出*name()就是输出字符串的首字母,不过字符串要到/0才会中止,那不久输出一串了吗?

也就是说我认为要输出地址里的值一定要带上前面的*,假设内存分配给name()的地址为2000,那么应该输出2000呀。

到底哪里理解错了呢。雷锋

追答

你的理解其实没错。字符串遇到\0结束,但是字符没有这个规则吧。输出name[0]本来是输出地址,如2000,但是C++有对<<重载,当name[0]是字符指针的时候,不输出地址了,输出串的值。具体如下:
1、*name[0]是一个字符型的值,它只是一个字符,不是字符串,不存在你说的遇到\0结束,它永远没有更多的东西。就像 char c='c'; *name[0]=c; cout<<*name[0]; 你可能认为输出串,那么cout<<c; 呢?还会输出串吗?
2、本来输出name[0]会输出一个地址对吧,因为它就是一个指针。但是C++的<<是重载过的,当它右侧是一个指向字符型的指针的时候,会把这个指针当作字符串名处理,输出整个串的值,这个才是遇到\0结束。至于具体怎么搞得,我也不知道。如果你想要输出它2000,也就是它的地址,反而需要别的方法。

相似回答