这是非常令人困惑的问题。而且一般的书上也说的不清楚。
先说一个简单的例子:
在学链表的时候就遇到了一个问题,如下:
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)。
说了这么多,变量和指针是可以通用的,都没有错误,只是内存分配的位置不同而已。