在c++中, Char a[10]=“abcd” Cout《a《endl 为何输出的是abcd?
本来这个问题并不复杂,但是由于题主个别概念有些问题,所以还是深入回答一下。
a本身的值确实只是一个const char*类型的地址。但C++中cout是被定义好的一个类的对象,
它和运算符“<<”连用时<<发生重载,语义被解释为输出<<右端指示的字符串。具体是通过运算符重载实现,类似于调用函数,只是右操作数作为地址被传入这个函数,然后函数内解析地址进行输出。注意重载是区分类型的,
所以如果a不是字符数组名而是int变量或者其它类型的话,
(只要有定义过——对于基本类型在STL中已有定义)调用的是不同的输出函数,
仍能得到正确结果。至于这里的具体行为,是由重载的运算符(函数)
对传入的参数指向的地址开始依次(从低地址到高地址,逐个地)
扫描并输出该地址的char字符(准确来说是写入标准输出流stdout,
至于stdout里的字符怎么跑到屏幕上的实现过程是操作系统的事),直至遇到'\0'停止运行。
它和C标准I/O方式的printf("%s",a)类似(而不是puts(a),puts会把末尾的'\0'转化为换行)。
a是char[]类型,这是不确切的。
a在编译期由右端的字符串字面量(引号为边界的部分)初始化,确定为常量,类型为const char[]而不是char[]。
无论如何,这确实是一个地址常量而非指针(以整数形式保存地址值的变量),这点是正确的。但LZ并没提到指针- -...
经过参数传递后,地址常量退化为对应类型的指针。也就是说在“<<”重载函数对应实现的内部而言,通过值参传递(a的值被复制在函数内产生一个副本),可以成为一个const char*类型的变量。注意这里const指指针指向的内容不可改变,而不是指针本身的值不可改变。
----
robinren240 提到的大体正确,细节错误上面已经说了。
----
qds316 说:“当使用cout()或者printf()输出该类型变量,就是字符串数组的时候,就会输出数据直至遇到\0为止”。
这里有问题。首先,cout()写法错误;其次,a是常量,不是变量。当然,对于cout来说,常量作为“<<”的操作数也能和变量以一样的形式输出(参见以上讨论),因为本身是只读操作,而a又是可以合法访问的,自然没有影响。
----
以上讨论的问题引发的关于数组名称的问题:
数组名本身是个地址常量,但是某些特殊情况下它的语义可以发生改变。例如sizeof(a),这时a表示整个数组对象(这里指语法对象,不是指类的实例)而不是这个常量本身。基于这个语义,对数组名取地址也是合法的,对于数组a来说&a的结果等于a这个地址常量本身的值。
这是C/C++标准委员会为了维护语法对象a作为一个左值(l-value)总可以取地址这条原则的妥协。
----
C/C++是传统的强类型语言。尽可能清楚掌握“类型”对于理解程序和写出更高质量C/C++的代码都有帮助。
在 C、C++中,字符数组的数组名指向字符数组的首地址,在输出时,会吧整个数组看成一个字符串输出,也就是说这里认为a是一个字符串。
因为c++知道 a是一个字符指针,知道要输出字符串
cout从首地址开始输出,直到遇到字符串结束字符'\0'结束输出
C语言char a[10]中[10]是什么意思
[10]表示字符数组a的维度大小。表示a数组在内存中占用10个(char)大小空间。另外作为字符数组,定义[10],实际只使用9个空间存储字符,最后一个留着存放字符串结束符号‘\\0’。
C++怎么用cin输入二维字符数组?
两种方法可以使用:定义二维数组char a[10][100];1,输入字符串方式。如果二维数组的每一行均为字符串,那么可以采用cin>>a[n]的形式输入,每次输入为数组的一行。2,输入字符方式。如果要存储的并不是字符串,而是可能包含空白字符,如换行符,制表符,空格等字符的字符串,就需要按字符输入,可以...
c语言,int a[10]可以存10个数,但char a[10]只可以存9个字符,最后一个存...
char a[10]只可以存9个字符,最后一个存结束号?是的,这是因为C语言的字符串是以'\\0'符为结束标志,如果没有这个结束符,编译器就不知道这个字符串到底有多长。char ch[N]; 这个字符数组实际可以存放的字符个数是(N-1)个,最后一个必须存放'\\0'结束符。而像Java、C#、Go、Python等语言,...
C++语言中char a =10和int b =a+'\\a'两段代码是什么意思?为什么得出b的...
第一句是定义了一个int型变量a,给他付初值为10;第二句定义了一个int型变量b,值为a+‘\\a’,而b是int型变量,所以要把等号右边的全部转化为int型,‘\\a’是一个转义字符,ASCII码是7,转化为int型就是7,所以b=10+7;
c\\c++中数值10是算一个字符还是算两个字符呢?
与数值类型和存放方式有关。unsigned char a = 10;printf("%d ",a);打印出10。这时 10 占了 1 个字符 的存放单元,1个byte 或 8 bits char a[]="10";printf("%s ",a); 打印出10。10 占了 2 个字符 的存放单元, 2个bytes 或 16bits short int a = 10;printf("%d ",a); ...
C语言定义数组问题
你这种抠细节的精神很好,我来告诉你正确答案。如果你是定义char a[10],那么你确保能使用的内存单元就是a[0]~~a[9],但是C编译器不会对数组下标进行检查,因此a[10]不会报错,并被编译为a[9]之后的那个内存单元。你定义a[10]的时候通常由于内存对齐等原因分配的内存会不止10bytes,因此编译器...
关于c字符数组的问题,请为小弟解开心中的疑惑
char a[]="12345"是系统根据字符串的实际长度来为a设定长度,所以长度是6。而char a[10]="12345“则是一开始就设定了数组长度为10,再往数组中初始化数据,不会改变数组本身的长度。总之,在声明时指明了长度的数组,在sizeof时求得的就是指定的长度。声明时没有指定长度的,根据初始化数据列表的...
char *a[10] = {"Fortran","Basic","pascal","C","C++"};
char *a[10][ ] 优先级高于 所以这是一个数组 数组的元素类型是 char 即字符型指针,指向字符串 char *a[10] = {"Fortran","Basic","pascal","C","C++"};a[0] = "Fortran"; a[1] = "Basic"; ...不是 char 如果是char char a[3] = { 'a', 'b', '\\0'};类同 char...
c++中如何定义一个字符串类型的变量
一般的方法就是和C语言中的一样,但是C语言中没有关于字符串的定义,在C中要定义字符串必须使用数组或者指针,如 char a[10];或者 char *a = “sfg”;但在C++中有一种更简单的方法,那就是string类, 可直接定义字符串, 例如string s("fsdfsdafs"); 而且他的好处是字符串 的长度是...
请教C++高手,有关数组的问题
无论是char数组还是int数组都没有\\0,所谓的\\0只是C编译器约定字符串常量用字符数组实现,并且以\\0结束。也就是说当你在代码出现了"abc"这样的字符串编译器就在数据栈中分配一个空间给abc\\0并返回一个char*指向'a'地址的指针。当然这只是约定,具体看C的函数printf和scanf如何实现 ...