C语言程序设计课件 第6章 指针_第1页
C语言程序设计课件 第6章 指针_第2页
C语言程序设计课件 第6章 指针_第3页
C语言程序设计课件 第6章 指针_第4页
C语言程序设计课件 第6章 指针_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章指针第6章指针6.1.1指针和地址6.1.2指针变量6.1指针与指针变量第6章指针想要理解指针,必须先了解数据在内存中的存储方式。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。如为整型变量分配4个字节,为单精度浮点型变量分配4个字节,为字符型变量分配1个字节。内存区的每一个字节有一个编号,这就是“地址”,它相当于教室中的房间号。在地址所标志的内存单元中存放的数据则相当于教室房间中的桌椅。1.数据存储方式由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。打个比方,一个房间的门口挂了一个房间号2000,这个2000就是房间的地址,或者说,2000“指向”该房间。因此,将地址形象化地称为“指针”,意思是通过它能找到以它为地址的内存单元。(1)内存以字节为单位,一个字节就是一个内存单元;每个内存单元都有一个不重复的编号,称为内存地址,内存地址是一个无符号整数。(2)单个变量(包括数组)按照其数据类型被分配一个或多个内存单元,这些内存单元在内存地址上是连续的,变量的值存放在这些内存单元中。(3)分配给单个变量的内存单元中,第一个内存单元的地址,称为变量的地址或首地址。C程序中所定义的每一个变量,都会被分配若干个连续的内存单元,变量的值就存放在这些内存单元中;变量被分配的内存单元数量由变量的类型决定。6.1指针与指针变量6.1.1指针和地址第6章指针2.直接访问定义变量后,对变量的访问实质是访问变量所占用的内存单元。请务必理解存储单元的地址和存储单元的内容这两个概念的区别。例如,程序已定义了3个整型变量a,b,c,在程序编译时,系统可能分配地址为2001~2004的4个字节给变量a,2005~2008的4个字节给b,2009~2012的4个字节给c,不同的编译系统在不同次的编译中,分配给变量的存储单元的地址是不相同的。在程序中一般是通过变量名来引用变量的值,例如:printf("%d\n",a);由于在编译时,系统已为变量a分配了按整型存储方式的4个字节,并建立了变量名和地址的对应表,因此在执行上面语句时,首先通过变量名找到相应的地址,从该4个字节中按照整型数据的存储方式读出整型变量a的值,然后按十进制整数格式输出。对变量的访问都是通过地址来进行的,例如:scanf("%d%d%d",&a,&b,&c);在执行时,假如输入变量a,b,c分别赋值为10,20,30,把从键盘输入的值送到地址为2001开始的整型存储单元中,则变量a被分配的内存单元为2001~2004,变量b被分配的内存单元为2005~2008,变量c被分配的内存单元为2009~2012,如图6.1所示,当执行语句“printf("%d\n",a);”时,从变量a占用的2001开始的内存单元中取出值10,将其输出到屏幕上,这种直接按变量名进行的访问,称为直接访问方式。6.1指针与指针变量6.1.1指针和地址第6章指针3.间接访问将变量a的地址存放在另一变量中,然后通过该变量来找到变量a的地址,从而访问变量a,称为间接访问方式。间接访问是先找到存放变量a地址的变量p,从其中得到变量a的地址(2001),从而找到变量a的存储单元,然后对它进行存取访问。例如,将数值10送到变量a所指向的单元(即变量a的存储单元),“*pointer_a=10;”,其中*pointer_a表示pointer_a指向的对象。指向就是通过地址来体现的,如pointer_a中的值是变量a的地址(2001),这样就在pointer_a和变量a之间建立起一种联系,即通过pointer_a能知道a的地址,从而找到变量a的内存单元,如图6.2所示,图中的箭头表示这种“指向”关系。6.1指针与指针变量6.1.1指针和地址第6章指针指针是一个地址,而指针变量是存放地址的变量,需要区分“指针”和“指针变量”这两个概念。例如,可以说变量a的指针是2001,而不能说a的指针变量是2001。1.指针变量的定义指针变量的语法格式如下。type*pointer_name;其中,type是指针所指向的数据类型(如int,char,float等)。*表示这是一个指针变量,称为指针运算符。pointer_name是指针变量的名字。2.指针变量的初始化与引用一般而言,讨论指针变量的值是没有意义的,指针的作用在于其应指向某个对象,使指针指向一个对象的操作称为指针变量的初始化。(1)指针指向变量的初始化。指针指向变量初始化时,经常需要使用取变量的地址运算符“&”,初始化格式如下。指针变量名=&变量名例如,有下列语句:inta;//定义整型变量aint*pointer_a;//定义指针变量pointer_apointer_a=&a;//变量a的地址存放在指针变量pointer_a中这组语句表示,定义了整型变量a和指针变量pointer_a,由取地址符号“&”得到变量a的地址,把该地址赋值给pointer_a,此时称pointer_a为变量a的指针,或者说pointer_a指向了变量a。当指针pointer_a指向了变量a后,可以通过pointer_a完成对变量a的各种操作。*pointer_a表示变量a的值,星号"*"也称为取值运算符。6.1指针与指针变量6.1.2指针变量第6章指针6.1指针与指针变量6.1.2指针变量注意:①标识符前面的“*”,表示该变量为指针变量,但指针变量名是pointer_a,而不是*pointer_a。②一个指针变量只能指向同一个类型的变量。例如,上述的pointer_a只能指向整型变量,不能指向实型变量。这个类型在定义指针变量时指定。指针变量的类型必须与所指向变量的类型一致。③指针变量中只能存放地址(指针),不要将一个整型数值(或任何其他非地址类型的数据)赋给一个指针变量。例如,下面的赋值是不合法的。pointer_a=10;//*pointer_a为指针变量,10为整数指针变量的初始化可以在定义指针时或者在定义指针后进行。定义时初始化:定义后初始化:inta=10,*pointer_a=&a;inta=10,*pointer_a;pointer_a=&a;//此处不能为*pointer_a=&a上述两种形式是等价的,在pointer_a中保存变量a的地址,称pointer_a指向变量a,pointer_a是一个指针变量。第6章指针6.1指针与指针变量6.1.2指针变量(2)指针变量的引用。【实例6.1】通过指针变量访问整型变量,并计算两个整数的和。程序代码如下。

#include<stdio.h>intmain(){//定义两个整型变量

intnum1=10;intnum2=20;//定义两个指针变量,分别指向num1和num2int*ptr1=&num1;int*ptr2=&num2;//通过指针访问变量的值,并计算它们的和

intsum=*ptr1+*ptr2;//输出结果

printf("num1=%d\n",num1);printf("num2=%d\n",num2);printf("通过指针访问并计算的和为:%d\n",sum);return0;}程序运行结果如下。num1=10num2=20通过指针访问并计算的和为:30第6章指针6.1指针与指针变量6.1.2指针变量【实例6.2】从键盘输入两个整数,通过指针变量对两整数进行从小到大排序。程序代码如下。(插入二维码V6-2通过指针变量对两整数进行从小到大排序)#include<stdio.h>intmain(){//定义两个整型变量用于存储输入的数值

inta,b;inttemp;//定义两个指针变量

int*ptr1=&a;int*ptr2=&b;//从键盘输入两个整数

printf("请输入两个整数:");scanf("%d%d",ptr1,ptr2);//使用指针进行输入

//输出排序前的值

printf("排序前:a=%d,b=%d\n",*ptr1,*ptr2);//使用指针进行排序(从小到大)

if(*ptr1>*ptr2){//交换两个指针指向的变量的值

temp=*ptr1;*ptr1=*ptr2;*ptr2=temp;}//输出排序后的值

printf("排序后:a=%d,b=%d\n",*ptr1,*ptr2);return0;}第6章指针6.2.1指针与一维数组6.2.2指针与二维数组6.2指针与数组第6章指针数组是最基本的构造类型,是相同类型数据的有序集合。数组中的元素按顺序存放在地址连续的内存单元中,每一个数组元素都有各自的地址,数组名是数组首元素的地址。对数组元素的访问,可以使用下标,也可以使用指针变量,移动指针可以指向数组中的任意一个元素。1.指针与一维数组的关系在C语言中,数组名本质上是一个指向数组首元素的指针常量。例如:inta[5]={10,20,30,40,50},*p;p=a;此时,a就是一个指向int类型的指针,其值是数组第一个元素的地址,即&a[0]。则p是指向一维数组的首元素的指针。由于数组名是数组首元素(a[0])的地址,因此上述定义等价于:inta[5]={10,20,30,40,50},*p;p=&a[0];执行语句“p=a;”或“p=&a[0]”都是表示使指针p指向a数组的第一个元素a[0],p+1指向数组元素a[1],p+2指向数组元素a[2],p+i指向数组元素a[i],因此*(p+i)就是a[i],所以数组元素a[i]可以用指针表示为*(p+i)。6.2指针与数组6.2.1指针与一维数组第6章指针【实例6.3】通过4种不同方式访问数组元素。程序代码如下。(插入二维码V6-3通过4种不同方式访问数组元素)#include<stdio.h>intmain(){inti,a[5]={10,20,30,40,50},*p=&a[0];printf("\na[i]:");for(i=0;i<5;i++) //常规下标法访问数组元素

printf("%5d",a[i]);printf("\n*(a+i):");for(i=0;i<5;i++) //数组名作为指针访问数组元素

printf("%5d",*(a+i));printf("\np[i]:");for(i=0;i<5;i++) //指针变量下标法访问数组元素

printf("%5d",p[i]);printf("\n*(p+i):");for(i=0;i<5;i++) //使用指针变量访问数组元素

printf("%5d",*(p+i));printf("\n");return0;}6.2指针与数组6.2.1指针与一维数组第6章指针【实例6.4】移动指针访问一维数组元素。程序代码如下。

#include<stdio.h>intmain(){inta[5]={10,20,30,40,50},*p=a;printf("\n*p++:");for(p=a;p<a+5;*p++)//*p++不能用*a++替换

printf("%5d",*p); printf("\n");return0;}程序运行结果如下。*p++:1020304050注意:a和p是有差别的,数组名a是一个指针常量,不可赋值,不能进行“a++”操作;p是一个指针变量,可进行赋值,可以进行“*p++”操作。在程序中,通过修改指针变量p访问数组中的元素。“*p++”的功能是间接访问p所指向的数组元素,然后将p指向下一个数组元素。6.2指针与数组6.2.1指针与一维数组第6章指针2.指针的运算指针运算是C语言中非常重要的概念,它允许通过指针来访问和操作内存中的数据。常见的指针运算包括指针与整数相加/相减、指针的递增/递减、两个指针相减(仅限指向同一数组的指针)、指针与指针之间的比较。(1)指针与整数相加/相减。指针可以加上或减去一个整数,表示移动指针到数组中的其他元素。【实例6.5】指针与整数相加/相减运算。程序代码如下。

#include<stdio.h>intmain(){inta[5]={10,20,30,40,50};int*p=a;//p指向a[0]printf("%d\n",*p);//输出10printf("%d\n",*(p+1));//输出20printf("%d\n",*(p+2));//输出30p+=3;printf("%d\n",*p);//输出40 p-=1;printf("%d\n",*p);//输出30 printf("\n");return0;}6.2指针与数组6.2.1指针与一维数组第6章指针(2)指针的递增/递减。【实例6.6】指针的递增/递减运算。程序代码如下。#include<stdio.h>intmain(){inta[5]={10,20,30,40,50},n;int*p=a;//p指向a[0]printf("%d",*p++);//输出10,然后指针指向a[1]printf("%d",*p--);//输出20,然后指针回到a[0] printf("\n");return0;}程序运行结果如下。10206.2指针与数组6.2.1指针与一维数组第6章指针注意:如果要按照次序对数组各元素进行操作,通常可以使用自增运算p++来完成指针移动。对于指针变量p,可以做以下运算:p++、p--、p+i、p-i、p+=i、p-=i等,若p指向数组a的起始地址,则:①p++(或p+=1),p指向下一元素,即a[1]。此时,*p就是a[1]的值。②*p++,由于++和*同优先级,是自右而左的结合方向,因此它等价于*(p++)。作用是先得到p指向的变量的值(即*p),然后再使p的值加1。③*(p++)与*(++p)使用不同。前者是先取*p的值,后使p的值加1;后都是先使p加1,再取*p。若p的值为a(即&a[0]),输出*(p++)时,得到a[0]的值;而输出*(++p),则得到a[1]的值。④(*p)++表示p所指向的元素值加1,即(a[0])++,如果a[0]=10,则(*p)++的值为11。注意,是元素的值加1,而不是指针值加1。⑤如果p当前指向a数组中第i个元素,则:*(++p)的值相当于a[++i],先取p自加,再做“*”运算;*(--p)的值相当于a[--i],先取p自减,再做“*”运算;*(p++)的值相当于a[i++],先取p值做“*”运算,再使p自加;*(p--)的值相当于a[i--],先取p值做“*”运算,再使p自减。6.2指针与数组6.2.1指针与一维数组第6章指针(3)两个指针相减(仅限指向同一数组的指针)。【实例6.7】两个指针相减运算。程序代码如下。#include<stdio.h>intmain(){inta[5]={10,20,30,40,50};int*p1=&a[1];int*p2=&a[3];intdiff=p2-p1;printf("p2-p1=%d\n",diff);//输出2,中间有两个元素 printf("\n");return0;}程序运行结果如下。p2-p1=2注意:两个指针必须指向同一个数组中的元素,否则行为未定义。6.2指针与数组6.2.1指针与一维数组第6章指针(4)指针与指针之间的比较。两个指针的关系运算,只适用于两个指针所指对象在同一数组中的情况,当指针p和指针q指向同一数组中的元素时,则有:当p<q时,p所指元素在q所指元素之前;当p>q时,p所指元素在q所指元素之后;当p==q时,p与q指向同一元素;当p!=q时,p与q指向不同元素。【实例6.8】指针与指针之间的比较运算。程序代码如下。#include<stdio.h>intmain(){inta[5]={10,20,30,40,50};int*p=&a[0];int*q=&a[2];if(p<q){printf("p所指元素在q所指元素之前\n");} printf("\n");return0;}程序运行结果如下。p所指元素在q所指元素之前6.2指针与数组6.2.1指针与一维数组第6章指针二维数组与一维数组一样,二维数组在内存中也是连续存储的,二维数组名a是数组的首地址。但二者不同的是,二维数组名的基类型不是数组元素类型,而是一维数组类型,因此,二维数组名a是一个行指针。1.二维数组元素的地址设有一个二维数组a,有3行4列,a[0][0]的地址为2000,数组中各元素的首地址,如图6.3所示,定义如下。inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};6.2指针与数组6.2.2指针与二维数组第6章指针a是二维数组名,a数组包含3行,即3个行元素:a[0],a[1]和a[2]。而每一个行元素又是一个一维数组,它包含4个元素(即4个列元素)。a[0]所代表的一维数组(第0行),包含4个元素,即a[0][0],a[0][1],a[0][2],a[0][3]。a[1]和a[2]则分别是a数组的第1行和第2行。二维数组a可视为由a[0],a[1]和a[2]三个元素组成的一维数组,如图6.4所示。6.2指针与数组6.2.2指针与二维数组第6章指针二维数组是由4个整型元素组成的一维数组,因此a代表的是首行(即序号为0的行)的起始地址,a+1代表第1行所构成的一维数组的起始地址。现二维数组a的首地址为2000,一个整型数据占4个字节,则a+1的值为2000+4*4=2016(第0行有4个整型数据)。a+1指向a[1],或者是a+1的值是a[1]的起始地址。a+2的值是a[2]的起始地址,它的值为2000+4*8=2032,如图6.5所示。二维数组名a、a+1及a+2所表示的地址,称为行地址。6.2指针与数组6.2.2指针与二维数组第6章指针数组a由a[0]、a[1]、a[2]和a[3]四个元素组成,a[0]是第一个一维数组的数组名,代表数组首元素的地址,a[0]代表一维数组中第0列的地址,即为&a[0][0],值为2000。a[0]+1代表1个列元素的字节数,即4个字节,a[0]+1的值是2004(而不是2016),等价于&a[0][1]。a[0]、a[0]+1、a[0]+2及a[0]+3所表示的地址,称为列地址。对于二维数组a,虽然a与a[0]所代表的值都是2000,但两者的类型是不同的,数组名a为行地址,a[0]为列地址,行地址与列地址的区别,如图6.6所示6.2指针与数组6.2.2指针与二维数组第6章指针在前面的讨论中已经知道a[0]+0和*(a+0)等价,a[1]和*(a+1)等价,a[i]和*(a+i)等价,所以a[0]+1和*(a+0)+1等价,都表示&a[0][1](其值为2004)。a[1]+1和*(a+1)+1等价,都表示&a[1][1](其值为2020)。a[i]+j和*(a+i)+j等价,都表示&a[i][j]。二维数组a中行列地址的常见表达方式,如表6.1所示。6.2指针与数组6.2.2指针与二维数组第6章指针2.指向二维数组元素的指针在C语言中,二维数组在内存中按照行顺序连续存放的,存放方式与一维数组并无区别,可以将二维数组当做一维数组进行处理。【实例6.9】使用一维指针访问整个二维数组(方式一)。程序代码如下。#include<stdio.h>intmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int*p=&a[0][0];//或者int*p=a[0];for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)printf("\n");//每4个元素换一行显示

printf("%-4d",*p);}printf("\n");return0;}程序运行结果如下。1234567891011126.2指针与数组6.2.2指针与二维数组第6章指针【实例6.10】使用一维指针访问整个二维数组(方式二)。程序代码如下。#include<stdio.h>intmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inti,j,*p=a[0];//指向第一行第一个元素for(i=0;i<3;i++){for(j=0;j<4;j++){printf("%-4d",*(p+i*4+j));}printf("\n");}return0;}6.2指针与数组6.2.2指针与二维数组第6章指针3.指向二维数组元素的指针变量(行指针)行指针p是用来存放行地址的变量。当p指向二维数组a中数组元素a[i][j]时,p+1将指向同一行中的下一个地址。行指针定义时,必须指明数组每一行元素的个数。【实例6.11】指向二维数组元素的指针变量(行指针)。程序代码如下。#include<stdio.h>intmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inti,j,(*p)[4]=a;//p是一个指向含有4个整数的一维数组的指针for(i=0;i<3;i++){for(j=0;j<4;j++){printf("%-4d",p[i][j]);//或者*(*(p+i)+j)}printf("\n");}return0;}6.2指针与数组6.2.2指针与二维数组第6章指针6.3.1字符指针与字符串6.3.2字符数组与字符指针处理字符串的区别6.3指针与字符串第6章指针在C语言中,字符串是通过字符数组或字符指针来表示的。字符串本质上是以空字符“\0”结尾的字符序列。字符数组表示字符串方式如下。charstr[]="Hello";str是数组名,也是指向字符串的指针。字符指针表示字符串方式如下。char*str="Hello";str是一个指向该字符串的指针。字符串“Hello”在内存中以字符数组形式存储,语句“char*str="Hello";”的含义是指针str指向字符串“Hello”的首字符,这里的“=”号表示将字符串“Hello”的第一个字符的地址赋给str。1.字符指针指向字符串常量【实例6.12】字符指针指向字符串常量。程序代码如下。#include<stdio.h>intmain(){char*p="Hello";printf("%s\n",p);//输出Hello return0;}程序运行结果如下。Hellop指向字符串常量"Hello"的首字符'H'。这种方式效率高,但字符串内容不能修改。6.3指针与字符串6.3.1字符指针与字符串第6章指针2.字符指针动态指向字符数组【实例6.13】字符指针动态指向字符数组。程序代码如下。#include<stdio.h>intmain(){chararr[]="Hello";char*p=arr;//或char*p=&arr[0];p[0]='h';//将arr[0]修改为:'h'printf("%s\n",arr);//输出helloreturn0;}程序运行结果如下。hello6.3指针与字符串6.3.1字符指针与字符串第6章指针3.使用指针遍历字符串【实例6.14】使用指针遍历字符串。程序代码如下。#include<stdio.h>intmain(){char*str="Hello,World!";while(*str!='\0'){printf("%c",*str);str++;}printf("\n");return0;}程序运行结果如下。Hello,World!6.3指针与字符串6.3.1字符指针与字符串第6章指针使用字符数组和字符指针变量都能实现字符串的存储和运算处理,但两者之间还是有区别的。1.赋值方法不同下面给出字符指针赋值的方法是正确的。char*a;a="Hello,World!";其含义是字符指针指向字符串"Hello,World!"的首地址,而下面字符数组的赋值方法是错误的。chara[20];a="Hello,World!";因为字符数组名a为常量地址,不能被赋值。2.系统分配内存单元的方法不同 字符数组定义以后,系统为其分配一段连续的内存单元,字符数组名为这段连续的内存单元的首地址;而字符指针变量定义以后,系统为其分配一个存放指针值(地址)的内存单元,其指向的对象并不明确。下面的字符数组的用法是正确的:chara[20];scanf("%s",a);而下面的字符指针的用法是错误的:char*a;scanf("%s",a);但字符指针一旦指向某个具体对象,就可以用于输入了,下面的用法是正确的:chara[20],*p=a;scanf("%s",p);6.3指针与字符串6.3.2字符数组与字符指针处理字符串的区别第6章指针3.修改地址的方法不同字符指针本质上是一个指向char类型的指针变量,它保存的是某个字符在内存中的地址。由于它是一个变量(而不是常量),因此可以多次修改赋值,指向不同的内存地址;字符数组名只能被引用,而不能被修改。【实例6.15】指向不同的字符串常量。程序代码如下。#include<stdio.h>intmain(){char*str;str="Hello,world!";printf("str:%s\n",str);str="Cispowerful!";printf("str:%s\n",str);str="Goodbye!";printf("str:%s\n",str);return0;}程序运行结果如下。str:Hello,world!str:Cispowerful!str:Goodbye!str是一个字符指针,它先后指向了不同的字符串常量。这是合法的,因为字符串常量存储在只读内存中,指针可以指向它们。6.3指针与字符串6.3.2字符数组与字符指针处理字符串的区别第6章指针【实例6.16】指向不同的字符数组。程序代码如下。#include<stdio.h>intmain(){chararr1[]="Apple";chararr2[]="Banana";char*ptr;ptr=arr1;printf("ptr:%s\n",ptr);ptr=arr2;printf("ptr:%s\n",ptr);return0;}程序运行结果如下。ptr:Appleptr:Bananaptr指向了两个不同的字符数组。数组名arr1和arr2会被视为数组首元素的地址。6.3指针与字符串6.3.2字符数组与字符指针处理字符串的区别第6章指针6.4.1二级指针6.4.2指针数组6.4二级指针与指针数组第6章指针在C语言中,二级指针是一个非常有用的概念,特别是在处理动态内存分配、修改指针本身、传递指针到函数等场景中。一级指针指向一个变量的指针,而二级指针则指向一个指针的指针。二级指针的定义格式如下。类型名**变量名引用二级指针变量所指的对象需要两次按地址取值。二级指针主要用于在函数中修改指针本身的值(即指针指向的地址)、动态分配指针数组(如二维数组、字符串数组)、实现灵活的数据结构(如链表、树中操作指针)、传递指针到函数并修改它。6.4二级指针与指针数组6.4.1二级指针第6章指针【实例6.17】通过二级指针访问整型变量。程序代码如下。#include<stdio.h>intmain(){inta=100;int*p=&a;//一级指针,指向变量aint**pp=&p;//二级指针,指向指针p//通过二级指针间接访问变量a的值

printf("a=%d\n",**pp);//输出:100//通过二级指针修改变量a的值**pp=200;printf("a=%d\n",a);//输出:200return0;}程序运行结果如下。a=100a=200pp是一个二级指针,指向一级指针p;*pp是一级指针(等价于p);**pp是最终指向的变量(等价于a)。6.4二级指针与指针数组6.4.1二级指针第6章指针在C语言中,指针数组是一个非常实用且常见的数据结构,它结合了数组和指针的特性。理解指针数组对于处理字符串数组、命令行参数、动态内存分配等场景非常重要。指针数组是数组的一种,数组中的每个元素都是指针类型。指针数组的定义格式如下。类型名*数组名[数组长度];例如:char*names[3];//一个包含3个char*指针的数组这个数组中的每个元素都可以指向一个字符串(即char*类型)。6.4二级指针与指针数组6.4.2指针数组第6章指针【实例6.18】指针数组存储多个字符串。程序代码如下。#include<stdio.h>intmain(){//定义并初始化指针数组

char*fruits[]={"Apple",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论