指针
- 变量的内存地址
%p格式符,表示输出变量a,b,c的值。
地址值是用一个十六进制(以16为基)的无符号整数表示的,其字长一般与主机的字长相同。
内存中的地址都是按字节编号的,即内存中每个字节的存储单元都有一个地址,在程序编译或函数调用时,根据程序中定义的变量类型为变量分配相应字节数的存储空间。
变量在内存中所占存储空间的首地址,称为该变量的地址。
变量在存储空间中存放的数据,称为变量的值。
如果在声明变量时没有给变量赋初值,那么他们的内容就是随机的、不确定的。
变量的名字可看成是对程序中数据存储空间的一种抽象。
- 指针变量的定义和初始化
存放变量的地址需要一种特殊类型的变量,这种特殊的数据类型就是指针。
具有指针类型的变量成为指针变量,它是专门用于存放变量地址值的变量。
其定义形式如下:类型关键字*指针变量名;
类型关键字代表指针变量要指向的变量的数据类型,即指针变量的基类型。
指针变量的定义只是声明了指针变量的名字及其所能指向的数据类型,并没有说明指针变量究竟指向了哪里。
指针变量为被初始化意味着指针变量的值是一个随机值。
为防止指针乱指一气,习惯上在定义指针变量的同时将其初始化为NULL(在stdio.h中定义为零值的宏)
在使用指针变量之前必须将其指向确定的内存单元。
只想某变量的指针变量,通常简称为某变量的指针。
虽然指针变量中存放的是变量的地址值,二者在数值上相等,但在概念上变量的指针并不等同于变量的地址,变量的地址是一个常量,不能对其进行赋值。而变量的指针是一个变量,其值是可变的。
指针变量只能指向同一基类型的变量 int *pa=&a
注意:在此表达式中*是指针类型说明符,不是间接寻址运算符
- 间接寻址运算符
直接按变量名或者变量的地址存取变量的内容的访问方式,称为直接访寻址。
例:scanf(“%d”,&a);
printf(“%d”,a)
通过指针变量间接存取它所指向的变量的访问方式成为间接寻址。
在C语言中,获取变量的地址需要使用取地址运算符&
指针运算符,也称为间接寻址运算符或解引用运算符,即*
间接寻址运算符*用来访问指针变量指向的变量的值。
运算时,要求指针已被正确初始化或以指向内存中某个确定的存储单元。
引用变量所指向的变量的值,也称为指针的解引用。
指针只有真正指向了一块有意义的内存后,才能访问它的内容
使用指针,必须恪守如下三条准则:
- 永远清楚每个指针指向了哪里,指针必须指向一块有意义的内存。
- 永远清楚每个指针指向的对象的内容是什么。
- 永远不要使用未初始化的指针变量。
- 按值调用与模拟按引用调用
按值调用:用普通变量做函数参数的方法,其实是一种按值调用的方法,及程序将函数调用语句中的实参的一份副本传给函数的形参。
按值调用的方法不能在被调函数中改变其调用语句的实参值。
模拟按引用调用:指针变量用作函数参数虽然实际上也是传值给被调函数(C语言中的所有函数调用都是按值调用),但是传给被调函数的这个值不是变量的值,而是变量的地址。
通过向被调函数传递某个变量的地址值可以在被调函数中改变主调函数中这个变量的值。
指针形参所指向的变量的值在函数调用结束后才能被确定。这样的指针形参称为函数的出口参数。
在函数调用之前必须确定其值的形参,称为函数的入口参数。
- 字符指针
字符指针是指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。
对于字符字面量而言,字符字面量本身代表的就是存放他的常量存储区的首地址,是一个地址常量。
正确使用字符指针,必须明确字符串被保存到了那里以及字符指针指向了哪里。