开发手册 欢迎您!
软件开发者资料库

C语言指针

C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。本文主要介绍C语言中的指针。

1、C语言指针

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。

& 是一元运算符,返回操作数的内存地址。例如,如果 var 是一个整型变量,则 &var 是它的地址。该运算符与其他一元运算符具有相同的优先级,在运算时它是从右向左顺序进行的。

*是一元运算符,返回操作数所指定地址的变量的值。指针声明示例如下:

int    *ip;    /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */

2、指针的使用

变量定义的时候给变量初始化,没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问。指针使用之后,如果不释放指针所使用的内存,就会造成内存的泄露,这样就会有大量内存由于没能释放,别的程序不可以使用这部分内存,如果一个程序不停申请内存而不去释放内存,很快就会造成系统的崩溃。在使用指针时一定要判断指针是否为空,如果为空,则做相应的操作。如果不做判断,则可能错误的使用空指针。

例如,

#include  int main (){   int  var = 20;   /* 实际变量的声明 */   int  *ip;        /* 指针变量的声明 */    ip = &var;  /* 在指针变量中存储 var 的地址 */    printf("var 变量的地址: %p\n", &var  );    /* 在指针变量中存储的地址 */   printf("ip 变量存储的地址: %p\n", ip );    /* 使用指针访问值 */   printf("*ip 变量的值: %d\n", *ip );   /*使用空指针初始化*/    int *pIntegerVal=NULL;   /*用变量初始化指针*/   int length=5;    int *pIntegerTemp=&length;   /*分配内存初始化指针*/    int *pInteger=(int*)malloc(10*sizeof(int));   //为指针分配大小为10个整数的内存空间。   /*内存申请和释放*/   if(pInteger != NULL)  {  free(pInteger);  pInteger=NULL;//指针释放之后并不为空,要设置其为空  }  pInteger=(int*)malloc(10*sizeof(int));  if(pInteger == NULL)  {  printf("内存申请没有成功\n!");  }   return 0;}

 3、C语言中的 NULL 指针

变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值。赋为 NULL 值的指针被称为空指针。

NULL 指针是一个定义在标准库中的值为零的常量。这样能很好的避句野指针。

例如,

#include int main (){   int  *ptr = NULL;   printf("ptr 的地址是 %p\n", ptr  );   return 0;}

注意:

大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。