C语言变量和指针区别 什么时候用指针,声明时候用变量?

这是非常令人困惑的问题。而且一般的书上也说的不清楚。
先说一个简单的例子:

在学链表的时候就遇到了一个问题,如下:

struct LinkNode{
    struct LinkNode *next;
    void *data;
};

//一种简单的封装
struct LList{
    struct LinkNode header;
    int m_size;
};

问题在于struct LinkNode header这行为什么用变量而不是用指针?
当时看到这行代码的时候就非常的困惑。
其实用指针和变量都是可以的。
区别就是如果你声明为指针那么你就要用malloc函数在堆中开辟空间,不然指针没有被初始化是非常危险的,会变成野指针导致,导致出现随机结果。
如果声明为变量,在C语言中普通变量是声明在栈中的。不需要手动分配空间。

再看一个简单的例子

int a;
int *a;

如果在文章一开头就举这个例子是非常不好的。因为不能说明问题。int *a指针,一定是要初始化的,不管是用malloc还是用取地址符号&。

之所以令人困惑的原因是很多入门的书籍,指针和动态内存是分开章节讲的,读者看前面的指针就已经被绕晕了。

其实本质上就两种指针 栈指针(通过&)和堆指针(通过malloc)。

说了这么多,变量和指针是可以通用的,都没有错误,只是内存分配的位置不同而已。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值