初始化一个数组,string r[33548][6];如果后面不给成员正确复制,或者其他种种原因,经常会出现栈溢出错误。
目标:
string str="sdf sdf"
char *s=str.c_str()//出错,不能将const char* 赋值给char*, str.c_str() 返回指针指向字符串首字符地址
char s[100];
strcpy(s,str.c_str());// ok
http://blog.csdn.net/csdn_zc/article/details/6656294
char *strtok(s, char *delim); //strtok(char* p1,char* delim) 形参是字符指针,实参可以直接使用字符串常量或者字符数组。
因为字符串常量 或字符数组 是存在 静态数据区的,他有一个地址,即第一个字符的地址。
功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。strtok在s中查找包含在delim中的字符并用NULL(' ')来替换,直到找遍整个字符串。返回指向下一个标记串。当没有标记串时则返回空字符NULL。v
内置类型:算术类型(arithmetic type)和void类型.
算术类型 | 最短存储空间 | ||
布尔值 | bool | 布尔型 | — |
整数 | short | 短整型 | 16b |
int | 整型 | 16b | |
long | 长整型 | 32b | |
浮点数 | float | 浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10为有效数字 | |
long double | 扩展精度浮点型 | 10位有效数字 | |
单个字符 | char | 字符型 | 8b |
wchar_t | 宽字符型 | 16b | |
算术类型存储空间一机器而定。C++规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。
左值:可以出现在赋值语句的左边或右边。
右值:只可以出现在赋值的右边。
定义对象:
int i;
int j=0,k;
std::string str;
类型决定了分配给对象的存储空间的大小,和可以在其上执行的操作。
变量初始化:
int ival(20);//direct-initialization
int ival1=20;//copy-initialization
std::string str1(9,'9');//str1="999999999",这里用一个计数器和一个字符初始化string对象。
变量初始化原则:要先有存储空间,才可以初始化。
内置类型:建议每个内置类型的对象都要初始化。
因为内置类型变量是否自动初始化取决于变量定义的位置。if在函数体外定义的内置类型变量都自动初始化为0,if在函数体内定义的内置类型变量不进行自动初始化。只能用作赋值操作符的左操作数。
类类型变量的初始化:构造函数。
声明和定义:定义(definition)用于为变量分配存储空间。(还可以为变量指定初始值,(可有可无))。声明(declaration)用于向程序声明变量的类型和名字。定义也是声明。可以通过extern 关键字声明变量名而不定义它。
extern int i;//declaration but does not definition
int i;// declaration and definition
extern声明不是定义,不分配存储空间,事实上,它只是说明变量定义在程序其他地方,程序中变量可以声明多次,但只可以定义一次。
只有当声明也是定义时,才可以有初始化式,以为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。
如果声明有初始化式,那么它可被当做是定义,即使声明标记为extern:
extern double pi=3.1415//definition
double pi;//error:redifinition
对于指针:有效地指针必然是以下3种状态之一:保存一个特定对象的地址,指向某个对象后面的另一对象,0值(表示不指向任何对象,但是是有效指针)。未初始化指针是无效的,直到给该指针赋值后才可以使用他。
建议程序运行前定义所有的变量,尤其是指针。C++标准中没有定义使用未初始化的指针,它几乎总会导致运行时崩溃。对大多是编译器来说,若使用未初始化的指针,会将指针中存放的不确定值视为地址,然后操作该内存地址中存放的为内容。
若果可能的话,除非所指的对象已经存在,否则不要先定义指针,以避免定义一个未初始化的指针。
如果必须分开定义指针,和其所指向的对象,则将指针初始化为0 (编译时可获得0值得const对象,或者字面值常量)。因为编译器可以检测出0值指针。程序可以判断出指针并未指向任何对象。
赋值:*操作符(解引用操作符)将获取指针所指的对象,解引操作符返回制定对像的左值,利用此功能可以修改指针所指对象的值:
string s("hello worlg");
string *sp=&s;
cout<<*sp;//获取指针所指的对象。
*sp="goodbye";//contents of s changed,对指针所指的对象赋值
string s2("new world");
sp=&s2;//sp now points to s2,对指针赋值,指向另一个对象
指针*和引用&的比较:
引用(reference)和指针都可以间接访问顶一个值。区别:1.引用总是指向某个对象,定义引用时没有初始化式错误的。2.赋值行为的差异:给引用赋值改的是该引用所关联的对象的值,而不是使引用与另一个对相关联。引用已经使用,就始终指向同一个对象(这就是为什么引用必须在定义时初始化的原因)(这与python中的可变mutable变量类似。p1=[2] p2=p1 p1.append(3) print p2 >>[2,3])。
如:
int ival1=1024,ival2=2048;
int *p1=&ival1, *p2=&ival2;
p1=p2; //p1 now points to ival2,ival1 does not change
/**reference**/
int &r1=ival1,&r2=ival2;
r1=r2;//assigns ival2 to ival1,ival1 changes
ival1=512; //r1也随之改变
现象 问题:
std::ifstream infile1("rm.txt");
std::string line1="a",word1="a";
getline(infile1,line1); //line1:183)uu
char l1[100];
strcpy(l1,line1.c_str());
//std::cout<<l1;
char* rs;
rs=strtok(l1,")");
//line1word1;
std::cout<<*rs<<rs;
int xxx;
std::cin>>xxx;
return 0;
输出的结果是183 1.
为什么rs,是个指向字符的指针,他的值为该字符为首的字符串??