【C++基础1】

1.将C++文本形式的代码转为机器可执行的语言,主要经过4个过程:预处理、编译、汇编、链接

2.变量名命名规则:字母、数字、下划线组成。
注意: 不能由数字开头,不可以是关键字,区分大小写,对于名称长度没有限制。

  1. 定义变量时系统会为变量开辟空间;
    声明变量时并不会为变量开辟空间。
    变量声明需要加extern修饰(一般用于多文件编译)

  2. ‘a’—97 ‘A’—65 ‘0’—48 ‘\0’—0
    大小写转换:差值固定为32.
    小写->大写: -32
    大写->小写:+32

    注意: ‘\0’和‘0’,数值0 的区别:
    1.‘\0’字符常量(char),ASCII为0.
    2.‘0’为字符常量(char),ASCII为48.
    3.数值0为整型常量(int),内存的存储值为0.

  3. 在每个字符串的结尾,编译器会自动地添加一个结束标志符’\0’,即“a”包含两个字符’a’和’\0’.

  4. 进制间的转换:(可参考:http://t.csdnimg.cn/DRLyK)
    二进制:0-1,0b开头
    八进制:0-7,0开头
    十进制:0-9,cout默认输出十进制
    十六进制:0-9 a-f (0-15) 0x开头
    n进制: 0-(n-1)

    (1)十进制转n进制
    整数部分:除以n,反向取余数,直到商为0终止。
    小数部分:乘8取整,顺序输出。
    (2)n进制转十进制
    xyz-> x * (n ^ 2) + y * ( n ^ 1) + z * ( n ^ 0)
    (3)二进制转八进制
    从右往左,“三合一” 取二进制数中的三位合为八进制数的一位
    (4)二进制转十六进制
    从右往左,“四合一” 取二进制数中的四位合为十六进制数的一位
    (5)八进制转二进制
    八进制数的一位是二进制数的三位
    (6)十六进制数转换成二进制
    十六进制数的一位是二进制数的四位
    (7)八进制与十六进制之间的转换
    借助二进制完成,可以先将八进制转换成二进制,再转换成十六进制。

7.C++ 内存分区:栈、堆、全局/静态存储区、常量存储区、代码区
(参考:http://t.csdnimg.cn/qpJ1i)
(1) 栈: 存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。(可读可写)
(2) 堆: 动态申请的内存空间,就是由 malloc 分配的内存块,由程序员控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。(可读可写)
(3) 全局区/静态存储区(.bss 段和 .data 段): 存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在 .bss 段中,初始化的放在 .data 段中,C++ 中不再区分了。(可读可写)
(4) 常量存储区(.data 段): 存放的是常量,不允许修改,程序运行结束自动释放。
(5) 代码区(.text 段): 存放代码,不允许修改,但可以执行。编译后的二进制文件存放在这里。

8.变量的存储

(1)普通局部变量
概念:在函数内部定义的,或者复合语句中定义的变量。
作用范围:
在函数定义的变量,在它的函数中有效。
在复合语句中定义的,在它的复合语句中有效。
被调函数的形参是被调函数的局部变量。
存储区域:栈区
注意: 1.普通局部变量不初始化内容不确定
2.普通局部变量同名就近原则(尽量别同名)

生命周期:
在函数调用之前,局部变量不占用空间,调用函数的时候才为局部变量开辟空间,函数结束,局部变量释放。

(2)普通全局变量
概念:在函数外部定义的变量。
作用范围:当前源文件以及其他源文件都有效。
只不过用之前需要声明。声明方法:extern int num;
注意声明的时候,不要赋值。
生命周期:程序运行的整个过程,一直存在,直到程序结束。(整个进程)
存储区域:全局区
注意: 1.定义普通的全局变量的时候,如果不赋初值,它的默认值为0。
2.全局变量和局部变量同名,优先选择局部变量。
3.其他源文件使用全局变量必须对全局变量进行extern声明(声明外部可用)

(3)静态局部变量
概念:定义局部变量的时候,前面加static修饰。
作用范围:在它定义的函数和复合语句中有效。
生命周期:
第一次调用函数的时候,开辟空间赋值,函数结束后,不释放。
以后再调用函数的时候,就不再为其开辟空间,也不赋初值。
用的还是以前那个变量。(整个进程有效)
存储区域:全局区
注意:
1.定义普通局部变量,如果不赋初值,它的值是
随机的*,打印会报错。
定义静态局部变量,如果不赋初值,它的值是0。
普通全局变量和静态全局变量如果不赋初值,它的值为0。
2.静态局部变量是整个进程都存在(第一次定义有效)*

(4)静态全局变量
概念:定义全局变量的时候,前面用static修饰。
作用范围:static 限定了静态全局变量的作用范围只能在它定义的.c(源文件)中有效。
生命周期:在程序运行的整个过程中,一直存在。(整个进程有效)
存储区域:全局区
注意:
1.定义静态全局变量的时候,如果不赋初值,它的默认值为0。
2.静态全局变量只能在当前源文件使用。

9. ifndef/define/endif的作用:避免头文件被重复引用。

10.#define宏
注意: 不要在宏后加;分号。
宏尽量大写,和普通变量区分开。
宏没有作用域的限制,只在当前源文件有效。
宏的参数不能有类型。
宏不能作为结构体类的成员。

11.宏函数和普通函数的区别
(1)编译过程上不同
在编译时,对于宏定义函数而言,预编译时会将这些宏定义函数按展开的规则直接展开成语句,并且宏定义函数在代码中书写多少次,便展开多少次,拷贝相应的代码插入,生成相应的指令,而对于普通函数而言其只会生成一份相应的指令,调用处会生成传参指令和调用指令实现对函数的调用。
(2)执行过程上不同
在实际执行过程中,宏定义式函数所有的语句都是普通语句执行,不需要压栈、出栈等操作,所以宏定义式函数浪费了空间,节省了时间;而普通函数由于需要调用的缘故,需要进行开辟栈空间、压栈、出栈等操作,所以普通函数浪费了时间,节省了空间。
注意: 函数有作用域的限制,可以作为类的成员。
宏函数没有作用域的限制,不能作为类的成员。

12.(1)在32位平台下,任何类型的指针变量都是4个字节大小。
(2)无论什么类型的地址,都是存储单元的编号。
(3)地址和指针变量的关系:
地址就是内存的地址编号。
指针变量:本质是变量。只是该变量保存的是内存的地址编号。(不是普通的数值)

13.指针变量的定义:
(1)定义步骤:
*修饰指针变量p;
保存谁的地址,就先定义谁;
从上往下整体替换。

  1. int num = 10;
    int *p;  //定义时,*p 仅修饰p为指针变量
    p = # //建立关系
    cout << *p; //10` 使用时,*p表示取p所保存的地址编号,对应空间的内容
    
  2. p的值就是num的地址;
    p保存了num的地址
    p指向了num
    p等价于&num;
    *p等价于num。

16.指针变量的类型(参考:http://t.csdnimg.cn/cZvE4)

17.内联函数:以 inline 修饰的函数叫做内联函数。在编译阶段将内联函数的函数体替换函数调用处,避免函数调用时的开销。
必须在定义时使用关键字inline修饰,不能在声明时使用inline.

18.宏的优缺点:
优点:增强代码的复用性;提高性能。
缺点:不方便宏调试(因为预编译就进行了替换);导致代码可读性变差,可维护性变差,容易误用;没有类型安全的检查。

19.宏函数和内联函数的区别:
宏函数和内联函数都会在适当的位置进行展开,避免函数的调用开销。
宏函数在预处理阶段展开,内联函数在编译阶段展开。
宏函数的参数没有类型,不能保证参数的完整性。
内联函数的参数有类型,能保证参数的完整性。
宏函数没有作用域的限制,不能作为命名空间、结构体、类的成员。
内联函数有作用域的限制,能作为命名空间、结构体、类的成员。

20.内联函数的注意事项:
(1)在内联函数定义的时候加inline修饰。
(2)类中的成员函数默认都是内联函数(不加inline也是内联函数)。
(3)有时候就算加上inline也不一定是内联函数。(内联函数条件)
(4)不能存在任何形式的循环语句;不能存在过多的条件判断语句;函数体不能过于庞大;不能对函数取地址。
(5)有时候不加inline修饰,也有可能是内联函数,内不内联,由编译器决定。

21.野指针:指针指向的位置是不可知的。

野指针的成因:
(1)指针未初始化;
(2)指针越界访问;
(3)指针指向的空间被释放(解决方法:当指针指向的空间被释放时,及时把指针置为NULL)。

22.常指针和指向常量的指针
int const * p / const int * p : 指向常量的指针 p指向的对象不可以通过p来改变,但是p的内容即p指向的对象可以改变。(这里的常量只是指不能通过p改变所指向的内容,而不是规定只能指向常量,也可以是变量)

int * const p : 常指针,p的内容即p指向的对象不能改变,但是可以通过p改变p所指向的对象

const int * const p : 指向常量的常指针,p的内容即p指向的对象不可以改变,也不可以通过p改变p所指向的对象。

你可能感兴趣的:(c++,开发语言)