内容正文:
第9章指 针
9.1 指针和指针变量的概念
9.2 指针变量的定义与应用
9.3 数组的指针和指向数组的指针变量
9.4 字符串的指针和指向字符串的指针变量
9.5 返回指针值的函数
9.6 指针数组与主函数main( )的形参
9.7 函数的指针和指向函数的指针变量
9.1 指针和指针变量的概念
为了形象地描述内存单元的数据在存取过程中单元地址的变化情况,引入了指针这一概念。其实,指针就是地址。
一般地,如果在程序中定义了一个变量,则编译时系统会根据变量的类型给变量分配一定长度的字节数。实际上,内存中每个字节都有一个编码,这个编码就是该字节的地址。假设程序已定义了二个整型变量i、j;二个实型变量a、b;二个字符型变量c1、c2,编译分配如图9-1所示
返回
9.2 指针变量的定义与应用
9.2.1 指针变量的定义与相关运算
1.指针变量的定义
指针变量的定义其实就是把存放地址的变量定义成“指针类型”。一般格式为:
类型名 *指针变量名;
2.指针变量的相关运算
(1) 指针运算符
有两个相关的运算符:
&:取地址运算符。
*:指针运算符(或称“间接访问”运算符)。
下一页
返回
9.2 指针变量的定义与应用
1)可用运算符&求变量的地址
用赋值语句使指针变量指向变量,例如:
p1=&i; (表示将变量i的地址赋给指针变量)
p2=&j; (表示将变量j的地址赋给指针变量)
则p1、p2分别指向了变量i、j。如图9-2所示。
2)可用运算符“*”引用指针变量
“*”运算符用于某个地址(如指针变量)之前,表示取*后地址中的内容。
上一页
下一页
返回
9.2 指针变量的定义与应用
(2) 指针的赋值与比较
例9.1
main( )
{ int a,b;
int *p1,*p2;
a=10;b=20;
p1=&a;p2=&b;
printf(“%d %d
”,*p1,*p2);
p1=p2;
*p2=5;
printf (“%d %d
”,*p1,*p2);
}
上一页
下一页
返回
9.2 指针变量的定义与应用
(3) 指针的算术运算
1)指针可以与整型数相加减
若指针变量p当前指向2000单元,其基类型是整型,则以下操作是合法的。
p=p+1 /* p指向2002单元 */
p=p+2; /* p指向2006单元 */
p=p-1; /* p指向2004单元 */
2)指针的减法运算
两个相同基类型的指针变量可以进行减法运算。设p1、p2均为指向整型变量的指针变量,且p1=2000,p2=2006,则p2-p1=3。3其实是(2006-2000)/2得到的结果,表示两个指针所指对象之间指针基类型的元素个数。系统会根据类型自动地进行地址运算,并不是两个地址的直接相减。
上一页
下一页
返回
9.2 指针变量的定义与应用
9.2.2指针变量作函数参数
函数的参数是一般变量或常数时,函数实参向形参是单向值传递。函数的参数是数组名时,则将实参数组名传递给形参数组名,数组名表示数组中第一个元素的地址,故这种传递是地址传递。函数参数还可以是指针变量,其作用是将变量的地址传到另一函数中去。下面用指针变量作为函数参数来实现两个整数按由大到小的顺序输出。
上一页
返回
9.3 数组的指针和指向数组的指针变量
9.3.1概述
C语言中数组与指针有着密切的联系,在编程时完全可以用指针代替下标引用数组及数组元素,且使数组的引用更为灵活、有效。当一个数组被定义后,程序会按照其类型和长度在内存中为数组分配一块连续的存储单元。此时,数组名成为符号常量,其值为数组在内存中所占用单元的首地址,也就是说数组名代表数组的首地址。指针是用来存放地址的变量,当某个指针存放数组名或数组中第一个元素的地址时,可以说该指针指向了这个数组,这样我们可以通过指针间接访问数组中的元素。
下一页
返回
9.3 数组的指针和指向数组的指针变量
9.3.2通过指针引用数组元素
通过指针引用数组元素,必须要定义指向数组的指针,例如:
int a[10];
int *p;
p=a;