指针的本质:间接访问
【*】解引用取地址对应的值 【&】取地址运算符:取变量的地址
函数调用的本质
每个函数对于数据的存储都有一个栈空间;
程序的运行本质上就是把内存空间反复修改;
函数调用本质是值传递,也就是换汤不换药,商品发生了传递,而配方并不会因此而改变;
code
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void change(int j);
void change(int j) {
j = 5;
}
int main() {
int i = 10; /*括号内定义的变量:局部变量*/
printf("before changing i = %d\n", i);
change(i);
printf("after changing i = %d\n", i);
return 0;
}
0x0078FBA8 0a 00 00 00 ....
0x0078FBAC cc cc cc cc ????
0x0078FBB0 d0 fb 78 00 ??x.
0x0078FBB4 b3 20 96 00 ? ?.
0x0078FAD4 0a 00 00 00 ....
0x0078FAD8 23 10 96 00 #.?.
0x0078FADC 23 10 96 00 #.?.
0x0078FAE0 00 f0 4c 00 .?L.
为什么要用指针传值?
仅传递值,相当于传递python当中的引用,无法对值进行实质性修改,必须传递内存地址,直接修改内存地址对应的数值,这样的修改才能有效;此操作类似于python当中的深拷贝,将内存地址拷贝过去,对拷贝变量的修改会同步到原数据;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void change(int *j);
/*解引用运算符,负责解析内存地址对应的值*/
void change(int *j) {
*j = 5;
}
int main() {
int i = 10; /*括号内定义的变量:局部变量*/
printf("before changing i = %d\n", i);
change(&i); /* 取地址运算符 */
printf("after changing i = %d\n", i);
return 0;
}
指针的偏移
数据类型的划分
默认地址引起的赋值冲突
微软对变量赋予默认值 0xcccccccc,相当于关键字占用,不能再将其赋予给变量;
出现上述报错是因为该处内存不可读;内存也有三个权限:可读,可写,可执行;