C/C++基础回顾(重点总结) | ICHARM

首页 » 博文 » Code » 正文

C/C++基础回顾(重点总结)

本文做如下声明,没有特别提示的函数,默认为iostream类库函数。

数组

  1. 编译器不会检查使用的下标是否有效,如果将一个值赋给不存在的元素months[101],编译器并不会指出错误。但这样赋值可能破坏数据或代码,导致程序异常。所以必须确保只使用有效的下标值。
  2. C++中不能将一个数组赋值给另一个数组:如下
    int hand[4];
    int car[4] = {2,2,3,4};
    hand = car;    //不允许
  3. 计算数组的长度(一维数组):
    int car[4] = {2,2,3,4};
    int len = sizeof hand / sizeof(int)    //不允许
  4. 如果只对数组的一部分进行初始化,则编译器将把其他元素设置为0。
    int car[4] = {0}; //所有元素设置为0
    int card[4] = {}; //所有元素设置为0
    int hand[4] = {1}; //第一个元素设置为1,其他元素设置为0

字符串

  1. 字符串与字符数组的区别:
    char dog[6] = {'a','b','c','d','e','f'};  //字符数组
    char cat[6] = {'a','b','c','d','e','\0'}; //字符串
    
  2. 字符串常量和字符常量的区别:
    char demo = 's'; //合法的字符常量赋给字符变量
    char tmp = "s";  //不合法,类型错误!,"s"表示字符串常量,它表示的是字符s和\0组成的字符串。"s"实际上表示的是该字符串所在的内存地址。所以这句不合法,试图将一个内存地址赋值给char变量
    
  3. sizeof和strlen(标准C语言函数库cstring)的区别
    const int size = 15;
    char name[size] = "icharm";
    cout << strlen(name) << endl;   //输出 6 ,储存在数组中字符串的长度,不包括\0
    cout << sizeof(name) << endl;   //输出 15 ,整个数组的长度 
    
  4. cin和getline()和get()函数的区别:
    const int size = 10;
    char name1[10];
    char name2[10];
    cout<<"please input your city name :"<<endl;
    //假设输入的内容为 New York
    cin>> name1 >> name2;  //name1="New", name2="York" cin使用空格、制表符、换行符来确定已完成字符串输入
    cin.getline(name1, size);        //name1="New York" getline()读取整行,以换行符来确定已完成输入, 注意这里是cin.getline()这样调用。
    
  5. string类介绍,C++98标准通过string类扩展了C++库,因此可以直接使用string类型的变量,string类使用起来比数组简单。使用string类型之前需要先#include,且使用std的命名空间
    #include <iostream>;
    #include <string>;
    use namespaced std;
    int main(){
    string name = "icharm";
    string city;
    cout<< "please input city name :\n";
    getline(city);       //读取一行,换车符结束输出。注意这里不是使用cin.getline()的调用
    
    }
    

指针

  1. 在对指针进行解除引用运算符(*)之前,将指针初始化一个确定的、适当的地址。这是关于使用指针的金科玉律
    long *fellow;
    *fellow = 223323;  //由于fellow指针指向的地址是不确定的(未初始化),所以给这个地址赋值,会造成无法预料的结果。
    }
    
  2. 不能直接将一个十六进制的地址赋值给指针,必须进行强制的类型转换:
    int * pt;
    pt = 0xB8000000; //错误,类型不匹配(不明确)
    pt = (int *) 0xB8000000; //正确
    }
    
  3. 指针的真正用武之地在于,在运行阶段分配未命名的内存以存储值 —— new运算符,在C++中程序员需要告诉new,要为哪种数据类型分配内存,new将找到一个长度正确的内存块,返回其地址。
    int *pt = new int;  //申请一个int的内存空间
    *pt = 101;  //给指针指向的内存空间赋值
    delete pt;  //释放分配的内存空间,释放并不会删除指针pt本身,还可以将其指向另外一个内存块
    }
    

    一定要配对使用new和delete;否则会产生内存泄漏(memory leak)。同时注意不要同时产生两个指向同一内存块的指针,因为这会增加的删除同一内存块两次的可能。

  4. new和delete的使用注意点:
    1.不要使用delete来释放不是new分配的内存
    2.不要使用delete释放同一内存块两次
    3.如果使用new []为数组分配内存,则应使用delete []来释放。
    4.如果使用new为一个实体分配内存,则应使用delete(没有反括号)来释放。
    5.对空指针使用delete是安全的。
    6.使用new动态分配的内存,这种信息是不公开的,例如,使用不能使用sizeof运算符来确定动态分配的数组包含的字节数。
  5. 在多数情况下,C++将数组名视为数组的第一个元素的地址,例如: int array[10]; //array 和 &array[0] 基本上属于等价关系
  6. 使用new动态分配任意长度数组
    int size;
    cin >> size;
    int * pt = new int[size];
    ...
    delete [] pt;
    

    一定要配对使用new和delete;否则会产生内存泄漏(memory leak)。同时注意不要同时产生两个指向同一内存块的指针,因为这会增加的删除同一内存块两次的可能。

发表评论