常量求值 在编译前
数组
每个元素不考虑对其,也不重叠存放
存放有连续性,一致性。

int ary[5] = {1, 2, 3, 4, 5};
ary 第零个元素的地址常量(常量也就意味着不想变量一样可以自增自减)
ary[n] address: 必须一个是整型,一个是地址类型
(int)ary + sizeof(type)*n

ary[n] address:
(int)ary + sizeof(type)*n
上面这个和ary[n]汇编代码一模一样,可以看到反汇编代码完全一致。

关于一些脑洞

如果想在现在ary初始19ff18情况下 访问0x400000
就需要400000-19ff18=13E498h=622650



由此,数组下表运算也可以获取内存中的任意点了。
有一个蛮有意思的问题
因为ary是一个常量,而内存结构当中,不能直接写入的只有代码区和data的只读区

本来ary是不能自增的,但如果有一个函数
那么他就作为参数传递到了栈空间(只有ary’首地址传递) ,就可以自增了。
同理常量传给函数,在函数体内就以变量存在了。
一个简单示例
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std;
void exchange(int n, int m)
{
int temp = n;
n = m;
m = temp;
}
int main(int argc, char* argv[])
{
int n = 2;
int m = 3;
exchange(n, m);
system("pause");
return 0;
}
让我们在内存里面看一下这个形参和实参
执行完这两步之后,在栈申请的空间里面做了赋值

然后准备调用函数
先做函数传递 返回地址 和栈底保存


然后运行第一条,之后把所指位置作为Temp赋值为2

在执行两条

直接在传递的参数这里做文章。
这就是形参和实参
要改变实参
- []下表运算
- *取内容
- ->成员体指向符
下标运算优先级高于取地址
浅讲windows内存结构

32位 x86处理器下,共4G大小
- 最上面64KB用作空指针检查,访问必报错C05
- 然后内核和用户空间有个数据交换区域,64KB,不给用户用
- 下面高两G是内核空间,也不让用
- 而剩下的用户区仍然有一些dll加载着
- 我们的code,data,stack,heap就在剩余的空间里面