int *p = NULL 和 *p = NULL 的区别
int *p = NULL;
可以通过调试器查看p的值为 0x00000000 。这句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是 int 类型的数据;在定义变量p的同时把p的值设置为 0x00000000,而不是把 *p 的值设置为0x00000000 。这个过程叫初始化。
int *p;
*p = NULL;
第一行定义了一个指针变量p,其指向的内存里面保存的是int类型的数据;但这时候变量p本身的值是多少不得而知,也就是说现在变量 p 保存的可能是一个非法的地址。第二行代码,给 *p 赋值为NULL;但由于 p 指向的内存有可能是非法的,所以调试器可能会报告一个内存访问错误。
将代码改写:
int i = 10;
int *p = &i;
*p = NULL;
如何将数值存储到指定的内存地址
往内存地址0x12ff7c上存入一个整数型0x100
int *p = (int *)0x12ff7c;
*p = 0x100;
或者:
*(int *)0x12ff7c = 0x100;
a 和 &a 的区别
int main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
printf("%d, %d\n", *(a + 1), *(ptr - 1));
}
&a + 1 :取数组 a 的首地址, 该地址加上sizeof(a)的值,也就是下一个数组的首地址。当前指针已越过了数组的界限。
(int * )(&a + 1): 把上一步计算出来的地址,强制转换为 int * 类型,赋值给ptr。
*(a + 1) : a 是数组首元素的首地址, &a 是数组的首地址。a + 1 是数组下一元素的首地址,即 a[1] 的首地址;&a + 1 是下一个数组的首地址。