指针
1.指针变量的定义
(1)定义
在程序中声明一个变量并用地址作为该变量的值,那这个变量就是指针变量。
(2)一般形式
类型名 *指针变量名
类型名指定指针变量所指向的变量的类型,必须是有效的数据类型。
int *p;
变量p是指向int型变量的指针。
指针变量名是指针变量的名称,必须是一个合法的标识符。
(3)指针与指针变量
C语言中,指针被认为是一个概念,是计算机内存地址的代名词之一。
指针变量本身就是变量,存放地址。
(4)指针变量所占内存
指针变量的类型不是指指针变量本身的类型,而是指向它所指向的变量的数据类型。
无论何种类型的指针变量,它们都是用来存放地址的,因此指针变量自身所占的内存大小和它所指向的变量数据类型无关
尽管不同类型的变量所占内存空间不同,但不同类型指针变量所占的内存空间大小都是相同的
(5)注意:
指针声明符*在定义指针变量时被使用,说明被定义的那个变量是指针。
定义多个指针变量时,每一个指针变量前面都必须加上*。
int *i,p;
//定义变量p,指针变量i;
int *i,*p;
//定义指针变量p,指针变量i;
2.指针的基本运算
如果指针的值是某个变量的地址,通过指针就能间接访问那个变量
(1)取地址运算
单目运算符&用于给出变量的地址
int *p,a=3; p=&a;
将整形变量a的地址赋给整形指针p,使得指针p指向变量a.
用运算符&取变量a的地址,并将这个地址值作为指针p的值,使指针p指向变量a.
指针的类型和它所指的变量的类型必须相同。
(2)间接访问运算
*除了被用于定义指针变量外,还被用于访问指针所指向的变量。
#include<stdio.h> int main() { int a = 3,*p; p = &a;//把变量a的地址赋给指针p,即p指向a; printf("a=%d,*p=%d\n", a, *p); *p = 10;//对指针p指向的变量赋值,相当于对变量a赋值; printf("%d ,%d\n", a, *p); scanf("%d", &a); printf("%d %d\n", a, *p); (*p)++; printf("%d %d\n", a, *p); return 0; }
(3)赋值运算
//一旦指针被定义并赋值后,就可以如其他类型变量 //一样进行赋值运算 #include<stdio.h> int main() { int a = 1,*p1,*p2; p1 = &a; p2 = p1; printf("a=%d,*p1=%d,*p2=%d", a, p1, p2); //将变量a的地址赋给指针p1, //再将p1的值赋给指针p2,因次指针p1,p2都指向变量a; return 0; }
3.指针变量的初始化
指针变量在定义后也要先赋值再引用
int a,*p1,*p2; int *p1=&a; int *p2=p1;
(1)
把一个变量的地址作为初始化值赋给指针变量时,该变量必须在此之前就已经定义。
因为变量只有在定义后才被分配存储单元,它的地址才能赋给指针变量。
(2)
可以用初始化了的指针给另一个指针变量作初始化值
(3)
不能用数值作为指针变量的初值,但可以将一个指针变量初始化为一个空指针
int *p=0; //这里0是ASCII字符NULL的值 //常量NULL在系统文件stdio.h中被定义,其值为0, //将它赋给指针时代表空指针
(4)
定义指针变量后,必须先赋值再引用。
未赋值的话,值不确定,它指向一个不确定的单元。(导致野指针)