(1/30计划)*2 之 指针的重拾(重识)

我逐渐明白了老师们说的话,少即是多,我也认同这句话,相对于C++的臃肿,C语言在我第一遍学完我感觉还行,但是忽然发现,我这TM学的都是什么呀???!!!尤其是指针这一块,同样的我也理解了C语言的厉害之处,少即是多用在C语言上再好不过了,他的精简让我觉得就是一把直接杀人的利器,相当于偃月刀,我是这么理解的,指针才是C语言的重中之重,如果还对着块有问题,那么秋招也就不用去了,今天开始就开始重新温习这一块的知识.能总结多少就看自己不清楚的地方的多少了

一. 指针自己所占用的内存空间 和 指针指向内存的空间

将内存看为一条长街上面的房间这个比喻是很贴切的,慢慢的我才理解了这种比喻,每个房间都有有一个门牌号,我们要寻找房间的话,通过这个房间门牌号可以找的到,当然我们要是知道这个房间更好,就不用通过门牌号了

int a = 10;
int *p = &a;		//p的内容就是a的地址

可以通过门牌号,也就是指针来访问,也可以通过这个房间的名字"a",来访问这个变量,两种方法,当然,在有些时候只能通过房间来访问,而修改"房间里面的内容"

void(int *left,int *right) {
	int temp = *right;
	*right = *left;
	*left = temp;
}

我想这个交换函数最能说明问题了,就是我们为什么不能直接去找房子,而只能通过门牌号去访问房子进行修改操作,这一块还有一个知识点,就是传值,传地址,传引用,我也会在后面总结的,目前先要总结指针这个大山.

有时候我会想为什么一定要malloc一个人空间给指针,指针不是有空间吗?
最后我理解了门牌号这个例子,门牌号就是地址,他也是需要空间来存储的呀,不然怎么完成寻址功能,可能这和我们日常的稍微有点偏差,但是在计算机里面就是这样:指针他代表了一段地址,就是一段数据,那么数据就应该是有大小的,在32位系统下,我们的指针大小是4字节,在64位下是8字节
多少位代表了可以寻址的空间,32位也就是说可以寻址32位的地址也就是32个1,换算成大小的话也就是4GB大小,也就是32位最多寻址4GB (0x00000000-0xffffffff)的范围,由于受限于操作系统实际可能比4G要小一点,因为你要给系统留一点操作空间.
所以这个门牌号也是需要空间的,所以指针也有自己所占用的内存空间,这个空间仅仅是门牌号,所以所有的指针类型的大小都是一样的,在32位操作系统下就是4字节,64位下就是8字节大小
需要注意的是sizeof是在编译器就开始做的事情.在程序执行之前,如果你的代码里面有sizeof,那么就是相应的大小了

指针指向内存的空间

int *ptr;
*ptr = 10;

这个代码肯定都知道,是不能通过编译的,这样操作是危险的,随机分配一个指针指向内存空间,如果这个空间是运行内核的一个数据,那么你修改了,系统不是就崩了,所以编译器会提醒你,没有初始化一个指针,编译通不过
怎么办?开辟一个内存空间,来使指针来指向这个开辟的空间,这个内存空间我们不知道具体的地址,但是编译器会给我们找一个合适的空间,我们定义的指针完成了一个指向,这样这个指针就完成初始化了.

int *ptr = (int *)malloc(sizeof(int));
*ptr = 10;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值