C语言指针

什么是指针?

C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。

它申明的形式如下:

type *varName

C 申明指针

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch     /* 一个字符型的指针 */
int    *arr[10]   // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int    (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int    **p;       // 声明一个指针 p ,该指针指向一个 int 类型的指针

C 初始化指针

  • 方式一:使指针指向现有的内存
int x = 1;
int *p = &x;

上面 int *p = &x; 表示 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址

  • 方式2:动态分配内存给指针
int *p;
p = (int *)malloc(sizeof(int) * 10); 
free(p);

上面 malloc 表示C分配内存的一函数,分配的大小为 sizeof(int) * 10;

free(p); 表示释放内存,这里是释放了我们刚才开辟的一个内存p,

注意:

malloc 和 free 都在 stdlib.h 这个头文件里,也就是说需要引入这个头文件!

C 中的 NULL 指针

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。

NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序:

#include <stdio.h>

int main ()
{
   int  *ptr = NULL;
   printf("ptr 的值是 %x\n", ptr  );
   return 0;
}

运行结果为

ptr 的值是 0

可以看到指针的地址为nil,即空值,也可以理解为0。在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是为操作系统保留的。但是,内存地址 0 有一个特别重要的意义,它表明改指针不指向一个可访问的内存位置。

那如何检查空指针?

if(ptr)     /* 如果 p 非空,则完成 */
if(!ptr)    /* 如果 p 为空,则完成 */

C中更多的指针的用法

概念 描述
指针的算术运算 可以对指针进行四种算术运算:++、--、+、-
指针数组 可以定义用来存储指针的数组。
指向指针的指针 C 允许指向指针的指针。
传递指针给函数 通过引用或地址传递参数,使传递的参数在调用函数中被改变。
从函数返回指针 C 允许函数返回指针到局部变量、静态变量和动态内存分配。