仙女多情电影:C++字符串问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/27 23:04:07
在C++里
char Tmpp[];或者
int a;
char Tmp[a];
是不合法的
但是char *tmp;
这样就可以,这两种有什么区别,char * tmp可以通过为什么,这样声明,和前面非法的声明相比有什么区别,在使用上用指针声明字符串和正常的声明字符串char tmp[4]比有什么区别
我知道哪种声明合法,哪种不合法
对于char *tmp这种方式我觉得这样声明编译器也无法了解,该变量需要分配的空间大小?
而我在声明了char *tmp;之后也可以这样使用tmp = "23234";或tmp[0] = "2",tmp[1]="3";......
是在这个时候才分配空间么?
还有用tmp = "23234"之前需要使用NEW来分配空间么?我没用过,应该是赋值的同时分配空间了吧?什么情况下应该使用new来分配空间呢?

如果你学过编绎原理的话,就会明白了。
-----------------------------------
编绎器也是一个程序,凡是程序,一定有他的规则。
1、char Tmpp[];
由此知道他是一个字符数组,作者没有给出数组大小。请问,如果你是编绎器,你怎么在内存中分配空间?你做不到的,编绎器也做不到。
2、int a; char Tmp[a];
如果你是编绎器,对于int a;很简单,分配四个字节的内存给它,顺便把它给初始化了。可对于Tmp[a]就难办了,因为编绎器知道这样是不安全的,不用说a的值可能是非法的情况,关键是如果用户动态的改变了a值,但做为一个静态数组,是无法处理的。。。为了防止这种问题的出现,也只好报错了。
3、char *tmp;
声名了一个字符指针。由它指向任意长的字符串,直到遇见'\0'空字符为止。
4、char tmp[4];
声名了一个长度为4的静态数组。在你非法引用时会提示越界。在初始化结束后,会自动在结尾补'\0'
----------------------------
以上几点都是在编绎时完成的。不同语言的编绎器处理得到的结果也许会有不同。像pascal语言中的String可以像数组一样的引用,但没有String[0],事实上,String[0]处的一个字节是由系统自动维护的字符串长度字节。

char Tmp[a]; 这里有错误->因为定义数组时,定义数组的大小在方括号中只能是常量,不能是变量.
你可以这样定义:
#define N 5 或 const int N=5;
int a[N];
这样是全法的
char Tmpp[];这个我想你没定义数组的大小;因为你没指定数组的大小,数组的行不可以省略,列可以省略.
在定义时指针数组和变通的定义方法是没有什么区别的,只不过是指针数组更方便一些,

你用指针声明的这个也不能直接用的,也要给它分配空间
其实主要原因就是不能这样动态的分配空间,可以用new

使用上似乎没啥大差别

关于数组的问题,楼上说的很好。关于指针,我觉得楼主对指针的理解还不够深刻,指针本身就是一个变量,它也是可以赋值的--只不过它存的数值比较特殊,是一个地址的而已。所以你定义一个char* pt也好,还是long* pt也好,编译器只会分配给pt指针变量的内存,和定义一个int i在分配内存上没有任何区别。至于"23234"这种常量,编译器会分配专门的空间给它们,而char* pt = "23234"的过程是,先分配一个指针的,然后分配常量串"23234"到某块内存,然后将该内存的地址赋值给该指针。所以严格讲char*和串没有关系,只是指向char型数据的指针而已!