通过程序来介绍

1

2

3

4

5

6

7

8

//c++ program

#include<iostream>

using namespace std;

int main(void)

{

    cout << "This is a c++ program." << endl;

    return 0;

}

1.iostream文件

iostream中的io指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。

并且c++的输入、输出方案涉及iostream文件中的多个定义。比如用来输出信息的cout就在其中。

2.头文件名的区别

C语言

C语言的传统是头文件使用扩展名 h,将其作为一种通过名称标识文件类型的简单方式。例如 math.h支持一些数学函数。

C++

C++头文件没有扩展名。
有些C头文件被转换成C++头文件,这些文件被重新命名,去掉了扩展名h,并在文件名称前面加上前缀c(表示来自C语言)

3.名称空间namespace

如果使用的是iostream,而不是iostream.h,则应使用名称空间编译指令来使iostream中的定义对程序可用,即

1

using namespace std;

有了这句using编译指令,才能使用cout、cin等,或者用第二种方式:

1

2

3

using std::cout;

using std::cin;

using std::endl;

名称空间是C++的特性之一,简单理解为:可以将自己的产品封装起来。

示例

封装性

示例:

首先定义一个头文件

在这里插入图片描述

在里面写上我们自己编的东西:

1

2

3

4

5

6

#pragma once

namespace AA

{

    typedef int INT;

    typename char CHAR;

};

然后在cpp文件中引入该头文件,但我们却无法使用之前写好的东西。

在这里插入图片描述

INT a会报错,因为我们只引入了头文件,没有使用里面的名称空间。

正确做法:

1

2

3

4

5

6

7

8

9

10

11

12

//c++ program

#include<iostream>

#include"AA.h"

using namespace std;

using namespace AA;

//using AA::INT;

int main(void)

{

    INT a = 10;

    cout << a << endl;

    return 0;

}

需要第六行的该名称空间才可以使用其中的产品。或者可以用第七行这种写法来确定自己只需要哪个产品。

运行结果:

在这里插入图片描述

4.使用cout进行C++的输出

上面的程序有这条C++语句:

1

cout << "This is a C++ program." << endl;

<<符号表示该语句将把这个字符串发送给cout,该符号指出了信息流动路径。 cout是一个预定义的对象。

从概念上看,输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性是在iostream文件中定义的。
cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中。

图示

在这里插入图片描述

指针和数组名的区别

程序示例:

1

2

3

4

5

6

7

8

9

10

11

#include<iostream>

using namespace std;

int main(void)

{

    int a = 10;

    int* p = &a;

    int arr[] = { 0,1,2,3,4 };

    cout << p << endl;

    cout << arr << endl;

    return 0;

}

这里定义了一个指针p和一个数组arr。

运行结果都是地址

在这里插入图片描述

反汇编查看区别

cout << p << endl;

1

2

3

4

5

6

    cout << p << endl;

008F52AF  mov         esi,esp 

008F52B1  push        offset std::endl<char,std::char_traits<char> > (08F103Ch) 

008F52B6  mov         edi,esp 

008F52B8  mov         eax,dword ptr [p] 

008F52BB  push        eax

cout << arr << endl;

1

2

3

4

5

6

    cout << arr << endl;

008F52DE  mov         esi,esp 

008F52E0  push        offset std::endl<char,std::char_traits<char> > (08F103Ch) 

008F52E5  mov         edi,esp 

008F52E7  lea         eax,[arr] 

008F52EA  push        eax

区别

在这里插入图片描述

在输出指针时,需要先从p里面取出四字节,再放到寄存器里push;

在输出arr时,直接把arr放到寄存器里再push。

结论

指针是变量;

数组名是一个地址——常量。

解引用

在C语言中学到,对指针解引用后得到的值就是它寸的地址对应的变量值。

可以来探索原理

程序示例

1

2

3

4

5

6

7

8

9

#include<iostream>

using namespace std;

int main(void)

{

    int a = 10;

    int* p = &a;

    *p = 20;

    return 0;

}

反汇编代码:

1

2

3

4

5

6

7

8

    int a = 10;

000D18FF  mov         dword ptr [a],0Ah 

    int* p = &a;

000D1906  lea         eax,[a] 

000D1909  mov         dword ptr [p],eax 

    *p = 20;

000D190C  mov         eax,dword ptr [p] 

000D190F  mov         dword ptr [eax],14h 

对于*p = 20

先从p的内存中取四个字节,即变量a的地址放入寄存器,再将20给到寄存器所存的的四字节中。完成对变量a的改变。

所以解引用的意思就是从地址中把值取出来,这里是去p的地址里取出所存的变量a的地址。

程序示例2:

1

2

3

4

5

6

7

8

9

#include<iostream>

using namespace std;

int main(void)

{

    int a = 10, b = 20;

    int* p = &a;

    b = *p;

    return 0;

}

复制讲解

反汇编代码:

1

2

3

4

5

6

7

8

9

10

    int a = 10, b = 20;

000818FF  mov         dword ptr [a],0Ah 

00081906  mov         dword ptr [b],14h 

    int* p = &a;

0008190D  lea         eax,[a] 

00081910  mov         dword ptr [p],eax 

    b = *p;

00081913  mov         eax,dword ptr [p] 

00081916  mov         ecx,dword ptr [eax] 

00081918  mov         dword ptr [b],ecx 

对于 b = *p;

1.先去p里取出四字节放入寄存器

2.再从寄存器eax取出四字节放入寄存器ecx再把ecx

3.的内容放入到变量b的四字节中。

也可以看出:解引用这一步其实是去地址里取值的。这样也可以得出:用一个变量赋值给另一个变量,其实也是在解引用

更多推荐