C Primer Plus学习 十九 指针和数组
来源:互联网 发布:java飞机大战敌机移动 编辑:程序博客网 时间:2024/05/16 18:41
指针提供了一种用来使用地址的符号方法。由于计算机的硬件指令很大 程度上要依赖于地址,所以指针使您能够以类似于计算机底层的表达方式来表达自己的意愿。这使得使用 了指针的程序能够更高效地工作。特别地,指针能够很有效地处理数组。我们将看到,数组标记实际上是一种变相使用指针的形式。
我们举一个这种变相使用的例子:数组名同时也是该数组首元素的地址。也就是说,如果flizny是一个数组,下面的式子是正确的:
flizny == &flizny[0]//数组名是该数组首元素的地址
flizny和&fliZny[0]都代表首元素的内存地址(回忆一下,&是地址运算符)。两者都是常量,因为在程序的运行过程中它们保持不变。然而可以把它们作为赋给指针变量的值,然后您可以修改指针变量的值,如程序清所示。请注意给指针加上一个数的时候,它的值会发生什么变化(回忆一下,指针说明符 %p通常以十六进制形式显示值)。
// pnt_add.c --指针加法
#include<stdio.h>
#define SIZE 4
int main(void)
{
short dates[SIZE];
short *pti;
short index;
double bills[SIZE];
double *ptf;
pti = dates; //把数组地址陚给指针
ptf = bills;
printf("%20s %11s\n","short","double");
for(index=0;index<SIZE;index++)
{
printf("pointers+%d: %10p %10p\n",index,pti+index,ptf+index);
}
return 0;
}
,index,pti+index,ptf+index 指针加1
输出结果:
十进制编译:
第2行打印两个数组的起始地址,第3行是地址加1的结果,等等。请注意地址是十六进制的,因此 30比2f大丨,比加大8。怎么回事?
0x0054fd20 + 1 等于 0x0064fd22?
0x0064fd30 + 1 等于 0x0064fd38?
真奇怪!我们的系统是按字节编址的,但是 short类型使用2个字节,double类型使用8个字 节。在C中,对一个指针加1的结果是对该指针增加1个存储单元(storage unit)。对于数组而言,地址会增加到下一个元素的地址,而不是下一个字节(请参见图10.3)。这就是为什么在声明指针时必须声明它所指向对象的类型。计算机需要知道存储对象所用的字节数,所以只有地址信息是不够的(即使指针是指向标量的,也需要声明指针类型;否则*pt操作不能正确返回数值)。
现在我们能够清楚地定义指向int的指针、指向float的指针,以及指向其他数据对象的指针:
•指针的数值就是它所指向的对象的地址。地址的内部表示方式是由硬件来决定的。很多种计算机 (包括PC机和Macintosh机)都是以字节编址的,这意味着对每个内存字节顺序进行编号。对于包含多个字节的数据类型,比如double类型的变量,对象的地址通常指的是其首字节的地址。
•在指针前运用运算符*就可以得到该指针所指向的对象的数值。
•对指针加1,等价于对指针的值加上它指向的对象的字节大小。
下面的等式体现出了C的优点:
dates + 2 == &date[2] /* 相同的地址 */
* (dates + 2) == dates[2] /* 相同的值 */
这些关系总结了数组和指针间的密切关系:可以用指针标识数组的每个元素,并得到每个元素的数值。 从本质上说,对同一个对象有两种不同的符号表示方法。C语言标准在描述数组时,确实借助了指针的概 念,例如,定义ar[n]时,意思是* (ar+n),即“寻址到内存中的ar,然后移动n个单位,再取出数值”。
- C Primer Plus学习 十九 指针和数组
- C Primer Plus学习 二十 函数、数组和指针
- 【C Primer Plus】第十章 数组和指针(一)
- 【C Primer Plus】第十章 数组和指针(二)
- 《C Primer Plus 5th》读书笔记-----指针和多维数组
- c primer plus第10章总结:数组和指针
- C Primer Plus学习 五十 函数和指针
- C Primer Plus学习 二十九 string.h strncat()函数
- C Primer Plus学习 十八 指针简介
- C Primer Plus学习 九 数组
- C Primer Plus学习 四十四 结构数组
- C++Primer 数组和指针
- 《C Primer Plus 第五版》第十章(数组和指针)编程练习
- 《C Primer Plus》读书笔记——数组和指针(1)
- C Primer Plus 第10章 数组和指针 编程练习
- 学习《C Primer Plus》---指针常量与常量指针
- c primer plus 指针与多维数组探究
- 【C++Primer学习笔记】第4章 数组和指针
- 五大常用算法
- ios如何获取安卓apk包的资源
- storm计算网站UV(去重计算模式)
- [李景山php]每天TP5-20161208|Loader.php
- 前台传入参数,后台返回字符串,解析为json
- C Primer Plus学习 十九 指针和数组
- 【编撰】linux IPC 001 - 概述
- Dagger2+MVP+RxJava+Retrofit从放弃到入门
- selenium使用中遇到的问题
- 什么是NSObject?NSObject 详解
- java生成pdf文件的说明
- ios 新特性
- Can not perform this action after onSaveInstanceState
- C++中父类的析构函数为什么要为虚函数