1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,Page,*,点击此处结束放映,第,5,章 指 针,指针的基本概念,5.1,指针运算,5.2,指针与字符串操作,5.3,5.1,指针的基本概念,5.1.1,指针,5.1.2,指针的定义与引用,1,指针的定义,所谓指针变量就是用来存放内存地址的变量。,指针变量的定义方式如下:,类型*变量名,1,;,/*,定义单个指针变量*,/,类型*变量名,1,,*变量名,2,;,/*,定义多个同类型指针变量*,/,综上所述,指针变量的特点如下。,指针是用来存储对象的内存地址的变量,对象可以是简单类型数据(,int,char,等),也可
2、以是数组、函数,还可以是另一个指针。,指针变量的值只能是内存中存在的一个地址,而不是一个任意的整数。,有关指针的说明很多是由指针、数组、函数说明组合而成的。但并不是可以任意组合,例如数组不能由函数组成,即数组元素不能是一个函数;函数也不能返回一个数组或返回另一个函数。,2,指针的引用,对指针变量的引用,由取地址运算符“,&”,和取值运算符“*”来完成。,取地址运算符“,&”,在前面的学习中已经见过,例如,在使用,scanf,(),函数进行输入时,就使用了“,&”,运算符将数据存储到指定的存储空间。,3,空指针,NULL,为指针变量赋值时,还可以用其他的指针或使用,NULL,来进行。,4,使用指
3、针的注意事项,指针是,C,语言中具有强大功能的工具,具有极大的灵活性,可以为程序设计者带来方便,但指针同时也最难掌握,最易出错。如果在程序中指针引用出现错误,轻则程序不能得到正确结果,重则程序崩溃,严重者还会影响其他程序和系统的正常运行,因此,在使用指针时一定要多加注意。,5.2,指 针 运 算,5.2.1,指针与数组,指针变量除了可以对其引用地址的内容进行运算外,其本身也可进行运算。指针是内存中的一个地址,对指针本身的运算只能是指针在内存中位置的改变,即指针可以作加、减运算,其结果是另一个内存地址。,由于指针运算的结果也是一个内存地址,为了使该地址是一个程序中的合法地址,指针的运算通常都是针
4、对数组而进行的。,指针可以用来对数组进行访问。数组的指针是指数组在内存中的起始地址,数组元素的指针是指数组元素在内存中的起始地址。,数组名也可以理解为一个指针,不过数组名是一个指针常量,不能改变。可以用数组名来将数组的首地址赋给指针。,数组指针的定义与普通指针的定义方法相同,数组指针的引用既可以用指针方式来进行,也可以用数组下标方式来进行,如果指针,p,是指向数组,a,首元素的指针,则*,(,p+n,),等价于,an,,如果指针,p,是指向数组元素,ak,的指针,则*,(,p+n,),等价于,ak+n,。,5.2.2,指针的运算,在指针进行运算之前,必须先将指针指向一个数组,当指针指向数组时,
5、可以进行如下的运算:,指针加上一个整数,结果是指向该数组的另一个元素的地址;,指针减去一个整数,结果是指向该数组的另一个元素的地址;,指针自增(,+,),结果是指针指向该数组的下一个元素;,指针自减(,-,),结果是指针指向该数组的上一个元素;,两个指针相减(要求两个指针都指向同一数组的元素),结果为两个指针相对移动的元素个数;,比较两个指针的大小(要求两个指针都指向同一数组的元素),实质上是比较两个指针所指数组元素下标的大小。,5.3,指针与字符串操作,5.3.1,字符串指针,可以定义一个字符型指针,使该指针指向字符串起始地址,就可以使用该指针来进行字符串的引用了,这个指针称为字符串的指针。
6、定义字符指针的方式如下:,char*,指针变量名,;/*,定义时不初始化*,/,char*,指针变量名,=,字符串常量,;/*,定义时进行初始化赋值*,/,5.3.2,字符指针与字符数组,1,字符指针与字符数组的关系,字符指针也可以用于指向一个字符数组的首地址,以此来引用该字符数组的内容。,2,字符指针和字符数组的区别,字符数组在定义时,不论是否进行初始化,都会为其分配存储空间,以存储数组的内容,它存储的是字符串本身的内容。,字符指针则不同,如果字符指针在字义时没有进行初始化,则不会为其分配字符串的存储空间,而只是分配一个指针变量的存储单元,用于存储指针;如果定义时进行了初始化,则在分配一块
7、连续内存空间存储字符串外,还分配一个存放指针变量的存储单元,并将字符串存储空间的起始地址赋给字符指针。,使用指针与数组进行字符串处理时,不同的是,指针可以通过赋值运算进行改变,而数组名则不能改变。,字符数组一旦定义,其使用的存储空间就是固定的,在任何时候都可以使用数组名对数组进行访问。字符指针变量只是一个指向内存地址的指针,它在程序中改变后将不再指向原来的内容。,字符数组只能在初始化时进行字符串的整体赋值,在程序运行中则不能;而字符指针变量既可以在初始化时进行字符串的整体赋值,又可以在程序运行中进行赋值,因为这个字符指针只是一个指针,在程序中是可变的,在程序中赋值后将指向所赋的字符串的内存起始地址。,字符数组名是一个常量,在程序中只能引用,不能改变;而字符指针是一个变量,在程序中可以指向任一位置,因此应该注意指针的位置,以防止引用出错。,还有一点需要注意,通过指向字符串的指针变量或字符数组名可以一次性输出整个字符串,但对于其他类型的数组却不能一次性整体输出。,5.3.3,指针数组,可以将一个数组定义为指针类型,这个数组称为指针数组。,指针数组定义如下:,数据类型*数组名,下标,;,