说明符和限定符
- auto : 将变量声明位自动变量
- register : 将变量声明为寄存器存储类型
- static : 被用于局部声明中,表示局部变量的存储持续性为静态
- extern : 表明是引用声明,即声明引用在其他地方定义的变量
- mutable : 它用来指出,即使结构或者类变量为const,其某个成员也可以被修改
- const : 表明内存被初始化后,程序不能再对它进行修改
- volatile : 表明即使程序代码没有对内存单元进行修改,其值也可能发生改变
最后一个限定符很有意思,怎么可能不修改,自己会改变呢?
其实例子是有的:比如一个指针指向某个硬件位置,其中包含了来自串行端口的时间或信息,此时硬件(而不是程序)可能修改其中的内容。或者两个程序可能相互影响,共享数据
下面我们看看new操作符的两种用法
#include <iostream>
#include <new>
struct chaff
{
char t[20];
int flag;
};//定义一个结构体
int buffer1[50];
char buffer2[100];//分配两个数组空间
int main()
{
chaff *p1,*p2;//两个结构体指针
int *p3,*p4;//两个int型指针
p1 = new chaff;
p3 = new int[20];
p2 = new (buffer2) chaff;
p4 = new (buffer1) int [20];
cout << p1 << " " << &p1<<"\n";
cout << p2 << " " << &p2<<"\n";
cout << p3 << " " << &p3<<"\n";
cout << p4 << " " << &p4<<"\n";
cout << &buffer1 <<"\n";
cout << &buffer2;
return 0;
}
输出结果
0x120e38 0x6dfeec
//第一个地址表示p1指向的新开辟的chaff结构的首地址
//第二个地址表示p1的地址
0x4c6100 0x6dfee8
//第一个地址表示p2指向的分配的空间的首地址
//可以知道它与数组buffer2的首地址是一致的
//第二个地址表示p2的地址
0x121330 0x6dfee4
0x4c6020 0x6dfee0
0x4c6020
0x4c6100
其余结果请读者自行分析
这里我们可以看到new 的两种用法:
1 在堆(heap)中找到一个足以能够满足要求的内存块
2 使用程序用所指定的位置来进行存储
您的点赞是我创作最大的动力!