c语言数组和指针的学习

上传人:夏** 文档编号:473065772 上传时间:2023-04-21 格式:DOC 页数:18 大小:32.51KB
返回 下载 相关 举报
c语言数组和指针的学习_第1页
第1页 / 共18页
c语言数组和指针的学习_第2页
第2页 / 共18页
c语言数组和指针的学习_第3页
第3页 / 共18页
c语言数组和指针的学习_第4页
第4页 / 共18页
c语言数组和指针的学习_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《c语言数组和指针的学习》由会员分享,可在线阅读,更多相关《c语言数组和指针的学习(18页珍藏版)》请在金锄头文库上搜索。

1、C语言数组与指针详解2008-08-11 02:01在语言中,指针和数组有着紧密的联系,其原因在于凡是由数组下标完成的操作皆可用指针来实现。在数组中我们已经知道,可以通过数组的下标唯一确定了某个数组元素在数组中的顺序和存储地址,这种访问方式也称为下标方式。例如: int a5 = 1, 2, 3, 4, 5, x, y; x=a2; /* 通过下标将数组a下标为2的第3个元素的值赋给x,x=3 */ y=a4; /* 通过下标将数组a下标为4的第5个元素的值赋给y,y=5 */ 由于每个数组元素相当于一个变量,因此指针变量既然可以指向一般的变量,同样也可以指向数组中的元素,也就是可以用指针方式

2、访问数组中的元素。 例10-6:分析程序的运行过程和结果。 #include main ( ) int a = 1, 2, 3, 4, 5 ; int x, y, *p; /* 指针变量p */ p = &a0; /* 指针p指向数组a的元素a0,等价于p=a */ x = *(p+2); /* 取指针p+2所指的内容,等价于x=a2 */ y = *(p+4); /* 取指针p+4所指的内容,等价于y=a4 */ printf (*p=%d, x=%d, y=%dn, *p, x, y); 语句p=&a0表示将数组a中元素a0的地址赋给指针变量p,则p就是指向数组首元素a0的指针变量,&a0

3、是取数组首元素的地址。 语言中规定,数组第1个(下标为0)元素的地址就是数组的首地址,同时C中还规定,数组名代表的就是数组的首地址,所以,该语句等价于p=a;。注意, 数组名代表的一个地址常量,是数组的首地址,它不同于指针变量。 对于指向数组首地址的指针p,p+i(或a+i)是数组元素ai的地址,*(p+i)(或*(a+i)就是ai的值,其关系如图10-5所示。 图10-5 指针操作与数组元素的关系 对数组元素的访问,下标方式和指针方式是等价的,但从语言系统内部处理机制上讲,指针方式效率高。需要注意的是:指针方式不如下标方式直观。下标方式可以直截了当地看出要访问的是数组中的哪个元素;而对于指向

4、数组的指针变量,进行运算以后,指针变量的值改变了,其当前指向的是哪一个数组元素不再是一目了然。 例10-7:分析程序。 main( ) int a = 1, 2, 3, 4, 5, 6; int *p; p = a; /* 指针p为数组的首地址 */ printf(%d, *p); printf( %dn, *(+p); /* 以下两个语句等价 */ printf(%d, *+p); printf( %dn, *(p-); /* *(p-)等价于*p- */ p += 3; printf(%d %dn, *p, *(a+3); 运行结果: 1 2 3 3 5 4 此例中指向数组a与指针变量p的

5、指向变化情况见图10-6。 注意,第2个printf语句中的*(+p),是先使指针p自增加,再取指针p值作*运算,它的含义等价于第3个printf语句中的*+p。而*(p-)是先取指针p值作* 运算,再使指针p自减减。 用指针方式实现对数组的访问是很方便的,可以使源程序更紧凑、更清晰。 指针基本运算 对于指针的运算有三种:指针与正整数的加减运算、两个指针的关系运算,以及两个指针的减法运算。 1. 指针与正整数的加减运算 当指针p指向数组中的元素时,n为一个正整数,则表达式: p+n 表示:指针p所指向当前元素之后的第n个元素。而表达式: p-n 表示:指针p所指向当前元素之前的第n个元素。 最

6、常见的指针加减运算为p+的含义是:指针加,指向数组中的下一个元素;p-的含义是:指针减,指向数组中的前一个元素。 指针与整数进行加减运算后,它们的相对关系如图10-7所示。 由于指针p所指的具体对象不同,所以对指针与整数进行加减运算时,C语言会根据所指的不同对象计算出不同的放大因子,以保证正确操作实际的运算对象。对于字符型,放大因子为1;对于整型,放大因子为2;对于长整型,放大因子为4;对于双精度浮点型,放大因子为 8。不同数据类型的放大因子等于一个该数据类型的变量所占用的内存单元数例10-8:编程将str1复制到str2中。 #include #include main( ) char st

7、r180, str280, *p1, *p2; printf(Enter string 1:); gets(str1); p1=str1; p2=str2; while ( (*p2=*p1) != 0 ) /* 指针p1的内容送到指针p2 */ p1+; p2+; /* 指针p1和p2分别向后移动1个字符 */ printf(String 2:); puts(str2); 程序中的关键是while语句,(*p2=*p1)!=0的含义是:先将指针p1的内容送到指针p2的内容中,即进行两个指针内容的赋值,然后再判断所赋值的字符是否是串结束标记0,如果不是串结束标记,则执行循环继续进行字符复制;如

8、果是串结束标记,则退出循环,完成串复制。 对于上面程序中的while循环,是可以进行优化的。优化后的循环可以如下: 优化一: while ( *p2 = *p1 ) p1+; p2+; 优化二: while ( *p2+ = *p1+ ) ; /* 循环体为空 */ 2. 两个指针的关系运算 只有当两个指针指向同一个数组中的元素时,才能进行关系运算。 当指针p和指针q指向同一数组中的元素时, 则: pq 当p所指的元素在q所指的元素之后时,表达式的值为1;反之为0。 p=q 当p和q指向同一元素时,表达式的值为1;反之为0。 p!=q 当p和q不指向同一元素时,表达式的值为1;反之为0。 任何

9、指针p与NULL进行p=NULL或p!=NULL运算均有意义,p=NULL的含义是当指针p为空时成立,p!=NULL的含义是当p不为空时成立。 不允许两个指向不同数组的指针进行比较,因为这样的判断没有任何实际的意义。 例10-9:编写程序将一个字符串反向。 #include main( ) char str50, *p, *s, c; printf(Enter string:); gets(str); p=s=str; /* 指针p和s指向str */ while ( *p ) p+; /* 找到串结束标记0 */ p-; /* 指针回退一个字符,保证反向后的字符串有串结束 标记0,指针p指向

10、字符串中的最后一个字符 */ while ( sp ) /* 当串前面的指针s(小于)串后面的指针p时,进行循环 */ c = *s; /* 交换两个指针所指向的字符 */ *s+ = *p; /* 串前面的指针s向后(+1)移动 */ *p- = c; /* 串后面的指针p向前(-1)移动 */ puts(str); 3. 两个指针的减法运算 只有当两个指针指向同一数组中的元素时,才能进行两个指针的减法运算,否则,没有意义。 当两个指针指向同一数组中的元素时,p-q表示指针p和q所指对象之间的元素数量。利用这一意义,可以求出一个字符串的长度。 例10-10:编写程序求字符串的长度。 #inc

11、lude main( ) char str50, *p=str; printf(Enter string:); gets(str); while ( *p ) p+; /* 找到串结束标记0。退出循环时p指向0 */ printf(String length=%sn, p-str ); /* 指向同一字符数组的两个指针进行减法运算,求出串长 */ 通过指针引用二维数组中的元素 在C语言中,二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。 如果有:int aMN; 则将二维数组中的元素aij转换为一维线性地址的一般公式是: 线性地址aiMj 其中:a

12、为数组的首地址, M和N分别为二维数组行和列的元素个数。 若有:int a43, *p; p = &a00; 则二维数组a的数据元素在内存中存储顺序及地址关系如图10-8所示。 这里,a表示二维数组的首地址;a0表示0行元素的起始地址,a1表示1行元素的起始地址,a2和a3分别表示2行和3行元素的起始地址。 数组元素aij的存储地址是:&a00+i*n+j。 我们可以说:a和a0是数组元素a00的地址,也是0行的首地址。a+1和a1是数组元素a10的地址,也是1行的首地址。 由于a 是二维数组,经过两次下标运算 之后才能访问到数组元素。所以根据C语言的地址计算方法,a要经过两次*操作后才能访问到数组元素。这样就有:*a是a0的内容,即数组元素a 00的地址。*a是数组元素a00。a0是数组元素a00的地址,*a0是素组元素a00。 例10-11:给定某年某月某日,将其转换成这一年的第几天并输出。 此题的算法很简单,若给定的月是i,则将1、2、3、i-1月的各月天数累加,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 文学/艺术/历史 > 人文/社科

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号