C++ 字符数组和字符指针

指针是指向变量或者类的地址.但对于字符数组或字符串为什么不是.请帮我解释一下,以下的代码为什么不显示地址,而是字符串.

char* Sp="Example One";
char Sa[]="Two";
cout<<Sp<<&Sa[0];
为什么转换成了字符串指针后就可以输出地址?
string* Ss=new string(Sa); //Sa为以上的字符数组
cout<<Ss;
你这个问题问得很好,我们知道实际上一个字符串在进行赋值的时候,例如:
char
*p="hello
world";这样赋值是允许的。那么这并不代表"hello
world"这个就是一个指针,实际上我们的这一动作,编译器在幕后为我们做了很多事,首先在常量区分配一个字符数组,然后将"hello
world"这个字符串中的字符(包括最后的'\0'字符。)拷贝到此数组(其实此数组我们可以看成是一个匿名数组,因为没有数组名)。然后返回数组首元素的地址,将此地址赋值给字符指针变量p。我们知道在c语言中没有字符串这种类型,在c语言中的字符串是通过字符数组来实现的,而且必须要求此字符数组具有'\0'结束符。这就是字符串与一般的字符数组不同的地方。
话说回来,你问到为什么char
*p="hello
world";
cout<<p<<endl;打印出来的是字符串,而不是地址。其实当初我也想到过类似的问题,没有找到权威的答案,但是我能够猜出几分。C++语言是兼容C语言的,所以在输出C串的时候是直接以给出的首地址,输出,直到遇到结束符'\0'结束。为什么尘漏会这样呢,我想着应该是语言的特性,或者是编译器的特性。既然C语言中字符串是通过带'\0'的字符数组实现的,那么请问如果编译器是由你来实现的,或者是printf()函数是你写的,要输出一个字符串的话你会怎么样呢,你是不是会输出指针的地址呢,cout<<p<<endl;这样的形式让读者一目了然,我要输出的就是一个字符串,而实际上p就是一个字符指针变量而已,为什么输出字符串,这在于cout的实现了,cout的实现我不的而知,但是可以肯定的是cout确实在遇到字符指针的时候会将做出这样的行为:将此指针当做首地址,向下输出字符,直到遇到'\0'结束为止。
这就是cout的行为,没有为什么。
其实你自己可以写一个自己的cout函数,输出地址而不是按照cout的默认行为。当然要实现cout的功能,必须要了解很多底层知识。
我们可以通过这样的方式输出字符察码指针的值,而不是输出以其为首地址的字符串。例如char
a='A';
char
*p=&a;
cout<<(int)(p)<<endl;
只需要将指针的值(地址值实际上在内存中就是一个整数,标识了内存的地址,只不过编译器认为其实指针类型罢了,实际上从本质上来说,计算机中的任何类型在内存中都是以二进制的形式存在的,根本没有所谓的派没烂类型之分。为什么有类型,这就是编译器将底层抽象的结果)。
你这个问题问得很好,我们知道实际上一个字符串在进行赋值的时候,例如: char *p="hello world";这样赋值是允许的。那么这并不代表"hello world"这个就是一个指针,实际上我们的这一动作,编译器在幕后为我们做了很多事,首先在常量区分配一个字符数组,然后将"hello world"这个字符串中的字符(包括最后的'\0'字符。)拷贝到此数组(其实此数组我们可以看成是一个匿名数组,因为没有数组名)。然后返回数组首元素的地址,将此地址赋值给字符指针变量p。我们知道在c语言中没有字符串这种类型,在c语言中的字符串是通过字符数组来实现的,而且必须要求此字符数组具有'\0'结束符。这就是字符串与一般的字符数组不同的地方。

话说回来,你问尘漏到为什么char *p="hello world"; cout<<p<<endl;打印出来的是字符串,而不是地址。其实当初我也想到过类似的问题,没有找到权威的答案,但是我能够猜出几分。C++语言是兼容C语言的,所以在输出C串的时候是直接以给出的首地址,输出,直到遇到结束符'\0'结束。为什么会这样呢,我想着应该是语言的特性,或者是编译器的特性。既然C语言中字符串是通过带'\0'的字符数组实现的,那么请问如果编译器是由你来实现的,或者是printf()函数是你写的,要输出一个字符串的话你会怎么样呢,你是不是会输出指针的地址呢,cout<<p<<endl;这样的形式让读者一目了然,我要输出的就是一个字符串,而实际上p就是一个字符指针变量而已,为什么输出字符串,这在于cout的实现了,cout的实现我不的而知,但是可以肯定的是cout确实在遇到字符指针的时候会将做出这样的行为:将此指针当做首地址,向下输出字符,直到遇到'\0'结束为止。 这就是cout的行为,派没烂没有为什么。 其实你自己可以写一个察码自己的cout函数,输出地址而不是按照cout的默认行为。当然要实现cout的功能,必须要了解很多底层知识。

我们可以通过这样的方式输出字符指针的值,而不是输出以其为首地址的字符串。例如char a='A'; char *p=&a; cout<<(int)(p)<<endl; 只需要将指针的值(地址值实际上在内存中就是一个整数,标识了内存的地址,只不过编译器认为其实指针类型罢了,实际上从本质上来说,计算机中的任何类型在内存中都是以二进制的形式存在的,根本没有所谓的类型之分。为什么有类型,这就是编译器将底层抽象的结果)。
指针就是指针没有什么不同。 只是在输出这里“人性化地”对指向字符的指针做了点特殊处理, 不打印地址而当作字符喊迟肆串来打印。 你可以把这个类型的郑轿输出作为一个特例

string *就是一个普通的指针了, 想看成字符串也旦伍没法弄
char *sp="example one"启锋;
char sa[]="two"雹链;
cout<<&sp[0];得到地址
cout<<&sa[0];得到地址源旁孙
cout << *Ss;