c++ 数组,变量,指针,引用, 初始化,赋值

初始化一个数组,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('\0')来替换,直到找遍整个字符串。返回指向下一个标记串。当没有标记串时则返回空字符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,是个指向字符的指针,他的值为该字符为首的字符串??