相信大家学习C语言之初都会接触到数组,也会接触到scanf函数中的&取地址符号,那么可能会有疑惑为什么scanf对数组变量不需要添加取地址符号呢。
其实数组名就是一个指针,指针是C语言特有的,指针指向了该变量在内存中的地址,而数组名就是该数组在内存中的首地址。
C语言进阶学习中大家都会接触到链表。
要学习链表首先要熟练掌握C语言中对地址的操作,C语言区别于其他语言的最大特征就是它允许程序员直接访问计算机内存地址。程序员通过指针访问内存地址。
例如一个int型指针的定义及初始化:int*p = NULL;
C语言最强大的地方莫过于此而最危险的地方也在此,对内存的操作不慎很可能让程序崩溃而在查BUG的时候往往不知道出错的位置。为此,我个人习惯将所有的指针变量自定义时即初始化,即使是初始化为NULL。
熟悉指针之后,接下来要了解的是开辟内存空间。
内存中分为代码区、静态/全局区、栈和堆几部分。
在某个函数中的简单声明,如 int a = 0。这个变量就是存放于内存的栈中。
若是全局变量或者添加了static关键字的变量声明,则会存放于静态/全局区。
而C语言中的malloc等函数,C++中的new关键字 能够开辟动态的内存空间,这种方式申请的内存空间存放于堆中。
栈中内存从大到小的递减方向进行使用,堆则是从小到大的递增方向——这影响了变量在生命周期结束时内存释放的顺序(不明白不用纠结,至少我目前没运用到这部分知识)
C语言中通常使用malloc()函数开辟空间,如:
#include <stdio.h>
#include <stdlib.h> //stdlib.h包含了我们需要的malloc()函数
#define MAX 999 //宏定义MAX为999
int main()
{
int *p = (int*)malloc(sizeof(int)*MAX); //声明int类型指针p,并调用malloc()函数,利用(int*)进行类型转换
return 0 //malloc()的参数填入你需要开辟内存空间的字节数
}
其中的MAX可以换成变量,这样的话,p指针指向了一块int类型的内存而且大小随变量变化。
相当于创建了一个动态容量的数组。
指针除了能够开辟动态内存、数组,还有更多更复杂的用法,例如二维数组、函数指针、指针数组、链表、函数指针作为另一函数参数等。有空再更啦,内容好多的。