指针是C语言中非常重要的概念,也是C语言的特色之一。
定义指针变量的一般形式为:
类型名 *指针变量名
例如,下列语句定义了指向float类型的指针变量p。
float *p;
指针用于存放变量的地址。
指针被定义后,必须将指针和一个特定的变量进行关联后,才可以使用指针,也就是说,指针变量要先赋值才能使用,当然指针变量被赋的值应该是地址。
指针的基本运算
指针可以同整数进行加减操作,例如,如果变量p是指向float类型变量的指针,那么表达式p+i代表了从p这个位置开始的第i个float类型变量的地址。
#include<stdio.h> void Print(int *a) { for(int i=0;i<10;i++) printf("%d ",a[i]); printf(" "); } int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; Print(a); int *c=a;//a是数组a的地址 printf("%d ",*c); printf("%d ",*c+1);//+1 printf("%d ",*c+2);//+2 return 0; }
指针与数组
1.在C语言中,数组名本身就是数组的基地址,即第1个元素(下标为0)的地址。
2.在函数定义中,被声明为数组的形参实际上是一个指针。当传递数组时,按值调用传递它的基地址,数组元素 本身不被复制。
3.数组名作为函数的实参,在被调用函数中,就能访问实参数组所在的存储单元,不但可以引用,还能改变这些单元的内容。返回主调函数后,相应数组元素的值就改变了。
#include<stdio.h> void Print(int *a) { for(int i=0;i<10;i++) printf("%d ",a[i]); } int main() { int a[10]={1,2,3,4,5,6,7,8,9,0}; Print(a); return 0; }
用指针实现内存动态分配
在动态存储方面C语言提供了一组标准函数,定义在<stdlib.h>里面,主要有:
1.动态存储分配函数void *malloc(size):在内存的动态存储区分配一连续空间其长度为size。
若申请成功,则返回一个指向所分配内存空间的起始地址;若申请内存空间不成功,则返回NULL(值为0)。
该函数的返回值为(void *)类型,在具体使用中,需要将malloc的返回值转换到特定指针类型,并赋给一个指针变量。
2.动态存储释放函数void free(void *ptr):释放由动态分配函数申请到的整块内存空间,ptr为指向要释放空间的首地址。
#include<stdio.h> #include<stdlib.h> int main() { int *p=(int *)malloc(sizeof(int)); printf("%d ",p);//地址 scanf("%d",p);//向p指向的内存中写入数据 printf("%d",*p);//使用间接访问运算符*访问p中的数据 free(p);//释放 return 0; }