对于初学C语言的朋友,指针会是学习的一大难点,而指针也是C语言的一大特点。刚接触指针你觉得非常的麻烦,但是不要去害怕学习指针。如果学习C语言都对指针的知识都不去认真了解,就很难说过去。本文先对指针的定义和简单的运用进行了解,其他重要的概念在另一篇文章中会详细介绍。
指针是什么?
指针是一个特殊的变量,它所存储的是另一个变量的地址(内存的直接地址)。指针在使用之前需要对其进行声明定义。通过指针你可以简化一些编程程序的执行,就像动态内存分配,没有指针就不能执行。指针定义的一般形式是:type *var-name;
或者你还不是很懂,下面用实际的类型进行声明:
int *a; 一个整型的指针
double *a; 一个 double 型的指针
float *a; 一个浮点型的指针
char *a; 一个字符型的指针
但是要注意的是,无论是用什么数据定义指针(不管是整型、浮点型、字符型,还是其他的数据类型),它都是一个代表内存地址的长的十六进制数。那为什么要用不同类型去定义。很简单,因为存储一个类型的变量地址就要用相同类型的指针。
说到这里,或许你还不知道变量的地址是如何表示的。学习C语言你会知道每一个变量都有一个存储的内存位置,而每一个内存位置都有一个地址(使用连字号(&)运算符表示)。如果你想知道具体的数值,你可以在printf中使用%x将之打印在屏幕上。例如:
在图中我们定义了两个int和char的变量,通过printf显示在屏幕上。要注意的是:在程序中,第二个printf中我们只是单纯的要在屏幕上显示数组的地址,系统默认数组的地址是数组的第一个。从下面两行也可以看出,数组的地址就是数组一个位置的地址。
指针如何使用?
使用指针的常用操作:定义一个指针变量,把要存储的变量地址赋值指针,然后在其他地方可以对指针中可用的地址进行访问。
要注意的是:定义的时候指针变量要用到 * ,但是在把地址赋值给指针时不用 *。还有就是赋值的时候要用&,表示传递的是地址。int *ip;ip=&var;
例子:
NULL指针
在声明指针变量的时候,在没有确切的地址赋值的时候是可以为指针变量赋一个NULL。NULL 是一个标准规定的宏定义,用来表示空指针常量。为指针赋一个NULL是一个良好的编程习惯。
我们可以看出a的值为0。但是对于大多数的操作系统,地址为0的内存是内存为操作系统保留的,程序是不允许访问的。但是地址为0有特别的意义,如果指针包含空值,就说它不指向任何的东西,该指针不指向一个可以访问的内存。
标准定义并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。
如需检查一个空指针,您可以使用 if 语句,如下所示:
if(ptr) // 如果 p 非空,则完成
if(!ptr) // 如果 p 为空,则完成
C语言中对于指针的重要概念还有很多,例如:指针的算术运算、指针数组、指向指针的指针、传递指针给函数以及从函数返回指针。这些概念都是一个C语言的编程人员必须清楚的概念。下面先对它们的简单的进行描述一下:
指针的算术运算 | 可以对指针进行四种算术运算:++、–、+、- |
指针数组 | 可以定义用来存储指针的数组 |
指向指针的指针 | C 允许指向指针的指针 |
传递指针给函数 | 通过引用或地址传递参数,使传递的参数在调用函数中被改变。 |
从函数返回指针 | C 允许函数返回指针到局部变量、静态变量和动态内存分配。 |
本文对指针的基本的概念进行讲解,其他重要的概念会在另一篇文章中具体的讲解。学习C语言的朋友可以先对本文中的知识点进行消化以便于学习指针中的重点概念。指针的基本的概念不弄清楚,在后续的编程中会有很多的混淆。