char ch[] 和 char*ch[]

char word1[]="life is so cool";(这一句是不是每个字符都存在wodr1[i]中了?
cout<<word1<<endl;(为什么能输出word1整个数组内容呢,不是只有一个头指针吗,应该输出word1的指向的内存地址啊,怎么输出了life is so cool?)
char *word2[]={"life","is","so","cool"};(这一句理解不了,char *数组 怎么指向的是一个string对象?)
新手求教了 , 求高手解答下 谢谢

char word1[]="life is so cool"; 等价于
char word1[]={'l','i','f','e',' ','i','s',' ','s','o',' ','c','o','o','l'}; 等价于
char word1[0]='l';
char word1[1]='i';
char word1[2]='f';
char word1[3]='e';
char word1[4]=' ';
char word1[5]='i';
char word1[6]='s';
char word1[7]=' ';
char word1[8]='s';
char word1[9]='o';
char word1[10]=' ';
char word1[11]='c';
char word1[12]='o';
char word1[13]='o';
char word1[14]='l';
char word1[15]='\0';//结束标志
cout<<word1;word1是数组名,也是一个指针,是一个数组的起始地址,cout后面跟数组名word1代表的是输出整个字符串。在数组操作时,cout的用法和输出一个普通变量不同。比如int a=5;cout<<a;就会输出5. 但是对于数组来说,cout后面就要跟一个指针了。这个指针就是数组名。所以楼主要更正cout后面只能跟变量这样的思维定势

第二问:
char word1[]={'l','i','f','e',' ','i','s',' ','s','o',' ','c','o','o','l'};
char *word2[]={"life","is","so","cool"};
请类比下,上面表达式中,每个元素是不是就是一个字符?比如'l','i','f','e',' ','i','s',' ','s','o',' ','c','o','o','l'这些都是char类型对吧
下面表达式中,"life" "is" "so" "cool"都是string类型也就是char *
所以word2前面要用char *,表明元素类型是字符串
word2[0]="life";
word2[1]="is";
word2[2]="so"
word2[3]="cool"
cout<<word2[0] 将会输出life
后面依次类推
可以上机试试哦 呵呵追问

在数组操作时,cout的用法和输出一个普通变量不同
int a[5]={1,2,3,4,5};
cout<<a<<endl; 输出的肯定是个地址不会输出1,2,3,4,5
是不是char类型重载了<<运算符?

追答

int a[5]={1,2,3,4,5};
cout<<a<<endl; 我在机器上输出的是一个32位的内存地址
0012FF34
楼主,我说的cout后面跟数组名只针对字符数组哦。你可以上机试试。

具体解释如下:
# include "iostream.h"
int main()
{
int a[]={1,2,3,4,5};
char b[]={'h','e','l','l','o','\0'};
cout<<a<<endl;
cout<<b<<endl;
return 0;
}

如上程序运行结果为:

0x0012FF6C
hello

如果在main()中添加以下语句,就可以看到字符数组的起始地址了

char*p=b;

cout<<(void*)p<<endl;//该与句可以查看字符数组b的指针地址

这样会输出地址同样是输出数组名,为什么cout<<a得到的是数组首元素在内存中的地址,而cout<<b得到的是整个数组中存储的数据?

一、结论
1、数组名跟指针很相似。从内存上看它们就是一样的东西,都是保存了某一个地址。
2、输出int数组名和输出指向int数组的指针结果是一样的。都是地址,可以看做是一个变量,这个变量里保存了的值就是地址。
3、输出char数组名和输出指向char数组的指针结果也是一样的。都是字符串,为什么是字符串而不是一个地址值呢?这个是编译器把它们区分开了,编译器对指向int数组的指针和指向char数组的指针作了区分,调用了不同的函数去输出。
详细了解可超链接:http://blog.csdn.net/stone_sky/article/details/7288013
这里解释很全面

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-13
1.每个字符都存在wodr1[i]中,然后最后还要一个结束字符'\0',word1代表的是数组的首地址,当输出的时候,将会冲首地址开始一直输出直到遇到结束标志'\0',所以输出的是一整串字符。
2.char *word2[];定义的是一个指针数组,数组的每个元素都是一个指针,分别指向不同的字符串,如,*word2[1]指向"life".
string是面向对象中一种对字符串操作的封装,其本质就是字符串数组,所以可以使用char *这种格式指向一个字符串,也就是你说的string对象。本回答被网友采纳
第2个回答  2015-10-27
1)
char ch[2]={'c','b'};
// 输出的的值相同
printf("%d\n",ch);
printf("%d\n",&ch);

char (*f)[2] = &ch ; // f是指向 char[2] 类型的指针,与数组的首地址相等
printf("%c,%c",f[0],f[1]);

char *pch="abc";
// 输出的的值不相同
printf("%d\n",pch);
printf("%d\n",&pch);
2)
char stra[10] = “howareypu”; // 字符串数组,用字符串常量进行初始化 不能改变大小或重分配 但可改变内容
stra[1] = ‘b’ ; // ok
char *strb = “wondebbic”; // str指向字符串常量,不能修改
strb[1] = ‘e’ ; // error

stra是数组名
strb是指针

根据x是数组还是指针, 类似 x[3] 这样的引用会生成不同的代码。认识到这一点大有裨益。

以上面的声明为例, 当编译器看到表达式 stra[3] 的时候, 它生成代码从stra的位置开始跳
过3个, 然后取出那个字符. 如果它看到strb[3], 它生成代码找到strb 的位置, 取出其中
的指针值, 在指针上加 3 然后取出指向的字符。换言之, stra[3]是名为stra的对象(的起始
位置) 之后3个位置的值, 而strb[3] 是strb 指向的对象的3个位置之后的值.

本质的区别在于类似 stra 的数组和类似 strb 的指针一旦在表达式中出现就会按照不同的方法计算
所以当在一个源文件中定义了char a[6], 在另一个文件中声明了extern char *a 。这样是错误的。
3)
当数组名作为函数参数的时候,数组名就转化为指针。
例:

void func(char *str)
{
printf( "%d\n" , sizeof(str) );
return 0 ;
}
int main( )
{
char str[9]="howareyou";
printf( "%d\n" , sizeof(str)); // 9 数组的大小
func(str); // 4 指针的大小
}
第3个回答  2012-06-13
赋值方法相同。但用法不一样。