C语言——指针
前言
指针提供一种以符号形式使用地址的方法,因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令以更接近机器的方式表达。
一、指针是什么?
指针是一个值为内存地址的变量(或数据对象),正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值就是地址。
假设一个指针变量名是ptr,可以编写以下语句:
ptr=&pooh;//把pooh的地址赋给ptr
(&后跟一个变量名时,&给出该变量的地址)
对于这条语句,我们说ptr“指向”pooh,ptr和&pooh的区别是,ptr是变量,而&pooh是常量,或者说,ptr是可修改的左值,而&pooh是右值,还可以把ptr指向别处,
ptr=&bah;//ptr指向bah,而不是pooh
现在ptr的值是bah的地址,不再是pooh的地址。
二、指针的间接运算符*
后跟一个指针名或地址时,*给出存储在指针指向地址上的值
ptr=&bah//假设已知ptr指向bah
然后使用间接运算符*找出存储在bah中的值,该运算符有时也被称为解引用运算符,不能把间接运算符和二元乘法运算符混淆,虽然它们使用的符号相同,但语法功能大不相同。
val=*ptr;//找出ptr指向的值,然后赋给val
//语句ptr=&bah和语句val=*ptr放在一起相当于下面的语句
val=bah;
三、声明指针
声明指针变量时必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间。
int *pi;//pi是指向int类型变量的指针
char *pc;//pc是指向char类型变量的指针
float *pf,*pg;//pf和pg都是指向float类型变量的指针
类型说明符表明了指针所指向对象的类型,(*)表明声明的变量是一个指针。
四、初始化指针
1、直接赋值给一个指针
可以通过将一个指针的值直接赋给另一个指针来进行初始化
int*p1;
int*p2;
int num=10;
p1=#//将num的地址赋值给p1
p2=p1;//将p1的值赋值给p2,即将p2初始化为p1指向的地址
2、使用静态分布的数组名
可以将数组的名称直接赋值给指针,此时指针将指向数组的第一个元素
int arr[5]={1,2,3,4,5};
int *p=arr;//将数组arr的首地址赋值给p
3、使用NULL进行初始化
可以使用NULL宏定义将指针初始化为一个空指针
int *p=NULL;//将p初始化为一个空指针
4、注意事项
千万不能使用未初始化的指针,例如:
int *p;//未初始化的指针
*p=5;
第二行的意思是把5存储在p指向的位置,但是p未被初始化,其值是一个随机值,所以不知道将5存储在何处。所以,切记,创建一个指针时,系统只分配了存储指针本身的内存,并未分配存储数据的内存,因此,在使用指针之前,必须先用已分配的地址初始化它。