指针的性质

个人学习,不对之处望请斧正

指针

直接上代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int q = 1;
    int * p = &q;

    printf("p表示%x\n",p);
    printf("*p表示%x\n",*p);
    printf("&p表示%x\n",&p);
    printf("&q表示%x\n",&q);
    printf("q表示%x\n",q);
    printf("&*p表示%x\n",&*p);
    return 0;
}

下方是输出结果

p表示61fe1c
*p表示1
&p表示61fe10
&q表示61fe1c
q表示1
&*p表示61fe1c

根据结果和代码不难看出以下几点:
p直接输出得到的是q的地址(&q)
*p直接输出得到的是q的内容
&*p直接输出得到的是q的地址(&q)
所以

p = &q
*p = q

但是也有一个特例

int main()
{
    int q = 1;
    int * p = &q;
    printf("p表示%x\n",p);
    *p++;
    printf("q表示%x\n",q);
    printf("p表示%x\n",p);
    printf("int大小为%x",sizeof(int));
    return 0;
}
p表示61fe14
q表示1
p表示61fe18
int大小为4

有意思的来了

int main()
{
    int q = 1;
    int * p = &q;
    printf("p表示%x\n",p);
    *p++;
    *p++;
    printf("q表示%x\n",q);
    printf("p表示%x\n",p);
    printf("int大小为%x",sizeof(int));
    return 0;
}
p表示61fe14
q表示1
p表示61fe1c
int大小为4

通过上述代码不难发现当执行*p++时 *p并不是所谓的q,是将自己所存储的地址加上指针数据类型的大小。而执行诸如*p = *p + 1;*p += 1;时却相当于q;


注:在使用int * a = 1;时代表的是a所指向的地址为1

结构体和指针

typedef struct node{
    int val;
    struct node *next;
}NODE;

int main()
{
    NODE n1;
    printf("%x\n",&n1);
    printf("%x",n1);
}
61fe10
61fe00

上述代码和输出不难看出使用NODE n1;会直接给n1分配内存控件,n1所储存是所指向的地址;n1.val可以直接获取n1结构体中val的值,结合上面的是不是可以使用 n1所指地址.val就可以获取n1结构体中val的值,这个等一下证明。
在这里插入图片描述
从上图可得结构体指针在声明的时候并不会给分配内存空间(它存储的内容是随机的地址);
在这里插入图片描述
如上图n2.val肯定是不能用的,但是

使用 n1所指地址.val就可以获取n1结构体中val的值

n2存的是n1的地址, n2 就是 n1的内容 ,n1的内容就是n1所指的结构体地址,所以n2也是n1所指的结构体地址这样的话 是不是可以直接*n2.val获取n1对应的值
在这里插入图片描述

果然,只不过需要加上括号。那既然*n2.val不行(*n2).val可以获取,那这样的话
在这里插入图片描述

括号牛逼。

终于消除了指针的种种疑问(目前来说)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值