关于指针(初步)

基础知识
1.定义:指针是一个变量。(指向地址)
eg:int * ptr;// 定义一个指向整型的指针,当然也可以是char型。
**2.**间接运算符 : * (解引用运算符)
一元运算符:& (进行取地址)
eg:

int * ptr;   //定义一个整型指针变量
int n = 10;       //定义一个整型
ptr = &n;    //将ptr指向n

此时 *ptr == 10; 间接运算符就是取地址上所存在的值。
指针的自加减(有的小伙伴内心是绝望的,前面正常的自加减还没太搞懂,现在又来了指针的自加减…)

int * ptr;
int a[5] = {1, 2, 3, 4, 5};
ptr1 = a;                    //ptr此时指向了a[0],也就是1.  (数组名就是数组的首地址!)
ptr2 = a;
printf("%d, %p", *ptr1, ptr1);        //地址一般用%p输出, 编译器不支持的用%x, 实在不行那就%d输出吧,反正差不多,不过一般是以十六进制输出地址

printf(" %d, %p", *ptr2++, ptr2++);  
//printf("%d, %p", *++ptr, ++ptr);

在这里插入图片描述
在这里插入图片描述
从这可以看出指针的自加减规则和前面的是一样的
++ptr, 先自加,此时是地址的自加,注意这里不是加1,而是加(基类型)(对应的字节),比如这里的整型,加了四个字节。
*++ptr, 那就是此时的指针往后移四个字节,指向下一个整型数据,如果这样不能理解的话,就像老师当初交给我们的一样,如果值是加1,那意义在哪里,加了一个字节,那只真指向了什么?
*++ptr, 这个就是先取ptr所指向的数,再加1,这个应该好理解。

可能细心的同学会问,上面为什么要定义两个指针变量呢?
其实我的当初想法是这样的:

    int * ptr;
    int a[5] = {1, 2, 3, 4, 5};
    ptr = a;
    printf("%p, %d\n", ptr, *ptr);  
    printf("%p, %d\n", ptr++,*ptr++);   
    printf("%p, %d\n", ptr, *ptr);

在这里插入图片描述

*****1.为什么第三行输出为3:*****如果用同一个指针,指针的每次变化都记录在案,指针可是很敏感滴,
比如上图ptr++, 指针在结束本语句后,会指向下一个地址,然后,*ptr++, 指针又要指向下一位,因此这一个语句中ptr移动了2位,也就是(2 4)个字节。
因此数字就由1向后移两位,输出为3.(地址也是向后移了两位,8个字节)
2.为什么第二行输出的地址和第一行不一样(加了四个字节,也就是自加了)
,但是我们不都是说加号在后面是在结束后再加的吗?
其实是在结束后再加的,但是别忘记(*ptr++ 和 ptr++在同一行),一行全部执行完毕再打印,让我们来执行一下:
1.执行 ptr++, 此时ptr的地址是不变的
2.执行 *ptr++,此时ptr++的自加就要发生作用了,*ptr++的值还是(ptr),而ptr已经自加了 ‘1’ .
3.输出:已经变了的ptr,和还未变的
ptr。给我们的视觉效果就是输出的地址变了,而值却未变。

所以啊,指针是真的恐怖,细节真多。本期的指针初步就到这里!
下次为大家带来指针进阶(等我自己先进个阶哈!)
bgm:好久不见(eason)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值