C语言深度解剖读书笔记3

本文深入解析C语言中int*p=NULL与*p=NULL的区别,解释指针初始化、内存地址赋值及数值存储原理。通过实例说明数组地址、指针运算及强制类型转换的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 是下一个数组的首地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值