C语言当中所有变量本质都是一个地址。
1.
int nNum = 'XXOO';
printf_s("%s", &nNum);
看到上面的例子没有,int变量怎么可以存字符呢,但是确实可以。通过把字符存到整形变量里面,再用字符串的形式输出。
但是请记住,在64位,32位的编译器中int占4个字节。所以只能写XXOO。写多了就错了!!!
2.
c中存在局部变量和和全局变量,
我们知道变量存在栈区中,怎么通过修改内存地址对应的值的方法来改变量的值呢?
void fun(){
int nNum[2] = {0};
nNum[0] = 0xAAAABBBB;
printf("nNum数组首位的地址 %p\n", &nNum[0]);
printf("nNum数组首位的十六位地址值 %p\n", nNum[0]);
printf("nNum数组第二位的地址 %p\n", &nNum[1]);
printf("nNum数组第二位的十六位地址值 %p\n", nNum[1]);
nNum[0x3A] = 0xCCCCDDDD;
return;
}
//全局变量 局部变量
int _tmain(int argc, _TCHAR* argv[])
{
int nNum = 0x11112222;
printf("nNum 的地址 %p\n", &nNum);
printf("nNum 的地址值十六进制表示 %p\n", nNum);
fun();
printf("nNum 的地址 %p\n", &nNum);
printf("nNum 的十六位地址值 %p\n", nNum);
return 0;
}
看上面这个神奇的例子,通过调用函数,也没有传指针,引用啥的就把nNum的值给改了。
这个例子中最重要的 0x3A 是通过 main函数里面的nNum的内存地址-fun函数里面的nNum的内存地址/4 ,除以4主要是一个int类型在内存中占4个字节。所以就可以改掉main中nNum的值了。神奇吧~
3.还有变量的存储在内存中是低位在前 高位在后 例如 12 31 AB CD 存的是 CD AB 31 12