zoukankan      html  css  js  c++  java
  • 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('')来替换,直到找遍整个字符串。返回指向下一个标记串。当没有标记串时则返回空字符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,是个指向字符的指针,他的值为该字符为首的字符串??

  • 相关阅读:
    【转】EDK简单使用流程(3)
    【转】应用 printf 语句格式化输出字符
    【转】[FPGA博客大赛](updated)在xilinx的FPGA系统中scanf函数的使用
    BZOJ 1083 [SCOI2005]繁忙的都市
    BZOJ 2821 分块统计
    BZOJ 1034 [ZJOI2008]泡泡堂BNB
    BZOJ 1029 [JSOI2007]建筑抢修
    BZOJ 1096 [ZJOI2007]仓库建设
    BZOJ 1070 [SCOI2007]修车
    BZOJ 1040 [ZJOI2008]骑士
  • 原文地址:https://www.cnblogs.com/xaf-dfg/p/3391216.html
Copyright © 2011-2022 走看看