c++字符数组的问题

1.比方说 char ch[20];我要输出一个字符串,为什么不需要一个for循环就可以直接输入了呢,怎么就可以直接cin>>ch呢?,然后输出也是,怎么不用for就可以一次性输出ch呢?
2.char *p=“hello",输出p,怎么输出的怎么成了hello?p应该是一个地址啊,而不是一个字符串啊

1. C++中,存放字符的数组可以分为字符数组与字符串数组。字符数组是指该数组中存放了字符,如:char ch[4]={'A','B','C','D'}; 该定义中ch为字符数组,该数组包含4个元素,但不含字符串结束符'\0',无法构成字符串,只能使用for输出。字符串数组就是数组中包含了字符串结束符'\0',该数组就可以作为字符串整体操作,如定义char ch[20]={ "abcd"}; 或者char ch[20]="abcd"; ch[4]的值为'\0',此时将ch作为字符串的首地址,cin自动识别为字符串,cin>>ch;就一次性输出ch数组中的字符,直到碰到字符串结束为止,而不用使用for输出了。当然,你一定要用for也可以实现,此时将字符串数组当成字符数组看待,遂个输出数组元素。
2. p为可以指向字符串的指针变量,"hello"作为字符串常量,在编程时,常量也是有内存空间存放的,只是其存放的地址我们不知道,但系统知道,所以,char *p=“hello",这个操作就是系统将字符串常量“hello"的首地址赋给p指针变量,则p相当于一个具有可变地址空间的字符串数组,而问题1中的ch相当于一个具有常量地址空间的字符串数组。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-28
ch[]与*ch 在赋值时是一样的
差别就是:
char *s中的s所指向的内容是常量,不允许修改
char s[]中的s是可以修改的
输出p,是输出指针指向的字符串,而保存的是这个字符串的地址本回答被网友采纳
第2个回答  2012-07-28
输入可以用\0 或者用while()
输出可以用指针连续输出,或者还是while
你要是想输出地址就 &P 而不是单纯的P,&为取地址的意思
楼下的错了 是&p 而不是*p=&()
第3个回答  2012-07-28
原因写在下面代码的注释中了。

#include "stdafx.h"
#include "DrdAnalyzer.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
void main()
{
// 问题一的解答:实际上,方法一方法二的内部实现,都是方法三。
char ch[20];
// 输入方法一:用cin,从标准输入缓冲区中,将输入的字符流复制到字符数组中
cin >> ch;
// 输入方法二:用scanf函数,从标准输入缓冲区中,将输入的字符流复制到字符数组中
scanf( "%s", ch );
// 输入方法三:用循环的方式,从标准输入缓冲区中挨个读取字符,赋值到字符数据中的每个元素。
for ( int i = 0; ; i++ )
{
ch[i] = getch();
putch( ch[i] ); // 回显
if ( ch[i] == '\r' )
{
ch[i] = '\0';
break;
}
}
// 输出方法一:用cout,将字符数组直接复制到标准输出缓冲区
cout << endl << endl << ch << endl;
// 输出方法二:用printf,将字符数组直接复制到标准输出缓冲区
printf( "%s\n", ch );
// 输出方法三:用循环的方式,将字符数组中的所有的字符,挨个复制到标准输出缓冲区。
for( int i = 0; i < strlen( ch ); i++ )
putchar( ch[i] );
putchar( '\n' );
// 问题二的解答:输出为字符串,而不是地址值的原因是,cout和printf对字符数组有特殊的解释。
char *p = "hello";
// 输出方法一:先输出字符串,再输出地址
cout << p << "," << (int)p << endl;
// 输出方法二:先输出字符串,再输出地址
printf( "%s,%d\n", p, p );
}
第4个回答  2012-07-28
c++是高级语言,cin标准输入流,它会自动处理你的输入流,为什么要用for,高级语言就是高级在这里,更加智能,而且如果每次你都用for不觉得很累吗,这样一个重复的过程并且常用的过程被语言设计者简化到cin,方便程序员。
char *p=“hello“ 典型的c风格字符串定义方式,如果你用cout<<p;cout识别出p,并用合适的方式输出,对于这种情况默认处理是从地址开始的位置(p存放的地址)到字符串结束("hello"字符串结束标志'\0')全部输出
如果想输出p存放的地址就用cout<<(void*)p;,只输出第一个字节就用cout<<*p;
第5个回答  2012-07-29
20是字符串长度的定义,当然输入一个字符串直接输入输出就行了。可能输入有误在看看
第6个回答  2019-03-12
经典解释int
char
a[12][10],
二维数组
有12个行数组,一个内花括号代表一个行数组,行数组以a[0],a[1],a[2]…做数组名,每个行数组有个10元素,例a[i][j]:a[i]是行数组名,a[j]是行数组中的元素a[j]
相似回答