#jitoa#[指针] 原创
本博客由金陵科技学院-开放原子开源社顾爱萍编写
指针的定义
- 在C语言中把专门用来存放变量地址的变量称为“指针变量 ,简称为指针。
如果一个指针变量的值是另一个变量的地址,就称该指针变量指向那个变量。 - 定义指针变量的一般形式为:
类型名 *指针变量名
例如:int *p;
指针的使用
指针的运算
- 取地址运算和间接访问运算
单目运算符&用于给出变量的地址。例如:
int p,a=3; p=&a;
将整型变量a的地址赋给整型指针p,使指针p指向变量a。也就是说,用运算符取变量a的地址,并将这个
地址值作为指针p的值,使指针p指向变量a。
在程序中, * 除了被用于定义指针变量外,还被用于访问指针所指向的变量,它也称为间接访问运算符。
例如,当p指向a时,p和a访问同一个存储单元,p的值就是a的值。(即p=3)
表达式p= * p+1、++ p和( p)++,
都是将指针p所指向变量的值加1。
而表达式p++等价于(p++),先取p的值作为表达式的值,再将指针p的值加1,运算后,p不再指向变量
a。
在下例中:int a=3;
int x,*p;
p=&a;
x=*p++;
指针p先指向a,接着把p所指向的变量a的值赋值给变量x,最后修改指针p的值,即此时指针p不再指向a; - 赋值运算
int a=3;
int *p1,*p2;
p1=&a;//让指针p1指向a;
p2=p1;//让指针p2指向指向指针p1所指向的地方,即p2指向a; - 指针变量的初始化
C语言变量在引用前必须先定义并赋值。指针变量在定义后也要先赋值再引用。
int m;
int *p;
p=&m;
指针与函数
地址传递:
下面是一个简单的交换函数:
#include<stdio.h>
void swap(int *px,int *py)
{
int t;
t=*px;
*px=*py;
*py=t;
}
int main()
{
int a,b;
int x,y;
scanf(“%d %d”,&a,&b);
x=&a;
y=&b;
swap(x,y);
printf(“a=%d,b=%d”,a,b);
return 0;
}
在函数swap()被调用时,将实参x和y的值传递给形参px和py,所以px和py中分别存放了a和b的地址,即px指向a,py指向b,由于px和a代表同一个存储单元,只要在函数中改变px的值,就改变了改储存单元的内容,即a的值变化,同理b的值也发生变化。
指针与数组
在很多方面数组和指针都能处理同样的问题,例:
求输入的n(n<100)个整数的和
但指针与数组有本质区别,数组a是常量,而指针是变量;
指针数组与数组指针
指针数组:元素是地址(指针);
定义:例:int *p[5];
数组指针:指向一级地址(可指向一维数组),不能指向某个元素;
定义:例:int (*p)[5];
用指针实现内存动态分配
动态内存函数(定义在stdlib.h里)
动态储存分配函数 malloc()
函数原型:void malloc(unsigned size)
功能:在内存的动态存储区中分配一连续空间,其长度为size。若申请成功,则返回指向所分配内存空间的起始地址的指针;若申请内存空间不成功,则返回NULL(值为0) malloc()的返回值为(void)类型(这是通用指针的一个重要用途)。在具体使用中,将 malloc()的返回值转换为特定指针类型,赋给一个指针。
调用该函数时,应利用sizeof计算存储块大小,不可直接写数值。
此外,每次动态分配都必须检查是否成功。