exeという名前のサフィックスは実行可能プログラムです
[プログラムが実行される前]:
コード領域:
バイナリコード
1.によって実行されたマシン命令CPU
2.共有、目的は、メモリスペースを無駄にすることなく、頻繁に実行されるプログラム用にメモリ内に1つのコードのみを持つことです。
3.プログラムが誤って命令を変更するのを防ぐために、読み取り専用
グローバルエリア:
グローバル変数、静的変数、文字列定数、const-変更されたグローバル変数(定数に属する)
[プログラム実行後]:
スタック領域:-コンパイラは完全に自動化されています
コンパイラはメモリを自動的に割り当てます
ストレージ:関数パラメーター値、ローカル変数(constで変更されたローカル変数を含む)など。
ローカル変数アドレスを返すことができません
スタック領域で開かれたデータは、コンパイラによって自動的に解放されます
ヒープ領域:-プログラマーは純粋に手動
プログラマーによって割り当てられてリリースされます。リリースされていない場合、オペレーティングシステムはプログラムの終了後に自動的に再利用します。
C ++では、newは主にヒープ領域のメモリスペースを開くために使用されます
ヒープ領域-アドレスが渡されます
新しいの使用
変数:データ構造*変数名=新しいデータ構造(変数値)
配列:データ構造*変数名=新しいデータ構造[配列の長さ]
[空き容量]
変数:p
を削除;直接削除を追加
配列:delete [] arr ;
add []を使用して、コンパイラに配列であることを通知します
詳細なプロセスは、コードを実行し、コメントに対してそれを理解することができます
/*
* 后缀名为exe的为可执行程序
* 【程序运行前】:
**代码区 - - 二进制的代码
1.CPU执行的机器指令
2.共享,目的是对于频繁执行的程序只需要内存有一个代码即可,不会浪费内存空间
3.只读,防止程序意外修改它的指令
**全局区:
全局变量,静态变量,字符串常量,const修饰的全局变量
* 【程序运行后】:
**栈区:-- 编译器全自动
编译器自动分配内存,存放函数的参数值,局部变量(包括const修饰的局部变量)等
不可以返回局部变量地址,栈区开辟的数据由编译器自动释放
**堆区:-- 程序员纯手工
由程序员分配释放,如果不释放,程序结束后由操作系统自动回收
在c++中主要以new在堆区开辟内存空间
*/
#include<iostream>
using namespace std;
//全局变量
int g_a = 10;
int g_b = 20;
//全局常量
const int c_g_a = 10;
//栈区 - 不可以返回局部变量的地址
//由编译器自己自动管理与开辟
int* func(int b)//int*代表数据类型,形参也是在栈区保存
{
b = 100;
cout << "函数内部参数的地址 :"<<(int)&b << endl;//栈区
int a = 10;
return &a;//错误操作
}
//堆区 - 传递的是地址
//1.堆区的变量创建:
int* func1()
{
//指针本身在栈区,是局部变量,但是值在堆区
int* a = new int(10);//数据结构 * 变量名 = new 数据结构(变量值)
return a;
}
//2.堆区的数组创建:
void func2()
{
int *arr = new int[10];//数据结构 * 变量名 = new 数据结构 [数组的长度]
for (int i = 0; i < 10; i++)
{
arr[i] = i + 10;
}
cout << "堆区的数组输出:";
for (int i = 0; i < 10; i++)
{
cout << arr[i] << "\t";
}
cout << endl;
//释放空间:
delete[]arr;//要加[],让编译器知道是数组
}
int main()
{
//堆区:
//1.堆区的变量创建:
int* p1 = func1();
cout <<"堆区的值:"<< *p1 << endl;
cout <<"堆区的值:"<< *p1 << endl;
//如果想释放内存空间的话,加一个delete
delete p1;
//cout << "堆区的值:" << *p1 << endl;会报错
//2.堆区的数组创建:
func2();
//栈区
//接受func的返回值
int* p = func(1);//用同一种数据结构接收函数的返回值
cout << "栈区的值:" << *p << endl;//可以正常输出,因为编译器自动做了保留
cout <<"栈区的值:" << *p << endl;//但是第二次错误,因为第二次不会再保留了
//普通局部变量(栈区)
int a = 10;
int b = 10;
cout << "局部变量的地址:" << (int)&a << endl;
cout << "局部变量的地址:" << (int)&b << endl;
//静态变量:前面加一个static(全局区)
static int s_a = 10;
static int s_b = 20;
cout << "静态变量的地址:" << (int)&s_a << endl;
cout << "静态变量的地址:" << (int)&s_b << endl;
//全局变量:(全局区)
cout <<"全局变量的地址:"<< (int)&g_a << endl;
cout << "全局变量的地址:"<<(int)&g_b<< endl;
//常量:
//1.字符串常量(全局区)
cout << "字符串常量的地址: " << (int)&"lihao" << endl;
//2.const 修饰的全局变量(全局区)
cout << "const 修饰的全局变量的地址: " << (int)&c_g_a << endl;
//3.const 修饰的局部变量(栈区)
const int c_a = 10;
cout << "const 修饰的局部变量的地址: " << (int)&c_a << endl;
return 0;
}