C Primer Plus(6) 中文版 第10章 数组和指针 10.3 指针和数组

10.3 指针和数组
指针提供一种以符号形式使用地址的方法。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指针以更接近机器的方式表达。因此,使用指针的程序更有效率。尤其是,指针能有效地处理数组。实际上,数组表示法其实是在变相地使用指针。
变相使用指针的例子:数组名是数组首元素的地址。也就是说,如果flizny是一个数组,下面的语句成立:
finzny == &finzny[0]; //数组名是该数组首元素的地址
finzny和&finzny[0]都表示数组首元素的内存地址(&是地址运算符)。两者都是常量,在程序的运行过程中,不会改变。但是,可以把它们赋值给指针变量,然后可以修改指针变量的值。
指针加上一个数时:
// pnt_add.c -- pointer addition
#include <stdio.h>
#define SIZE 4
int main(void)
{
    short dates [SIZE];
    short * pti;
    short index;
    double bills[SIZE];
    double * ptf;
    
    pti = dates;    // assign address of array to pointer
    ptf = bills;
    printf("%23s %15s\n", "short", "double");
    for (index = 0; index < SIZE; index ++)
        printf("pointers + %d: %10p %10p\n",
               index, pti + index, ptf + index);
    
    return 0;

/* 输出:

*/ 

我们的系统中,地址按字节编址,short类型占2字节,double类型占8字节。在C中,指针加1指的是增加一个存储单元。对数组而言,意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址。这是为什么必须声明指针所指向对象类型的原因之一。只知道地址还不够,因为计算机要知道存储对象需要多少字节(即使指针指向的是标量,也要知道变量的类型,否则*pt就无法正确地取回地址上的值)。
现在可以更清楚地定义指向数据对象的指针。
*指针的值使它所指向对象的地址。地址的表示方式依赖于计算机内部的硬件。许多计算机(包括PC和Macintosh)都是按字节编址,意思是内存中的每个字节都按顺序编号。
*在指针前面使用*运算符可以得到该指针所指向对象的值。
*指针加1,指针递增它所指向类型的大小(以字节为单位)。
下面的等式体现了C语言的灵活性:
date + 2 == &date[2] //相同的地址
*(date + 2) == date[2] //相同的值
可以使用指针标识数组的元素和获得元素的值。从本质上看,同一个对象有两种表示法。实际上,C语言标准在描述数组表示法时确实借助了指针,也就是说,定义ar[n]的意思是*(ar + n)。可以认为*(ar + n)的意思是“到内存的ar位置,然后移动n个单元,检索存储在那里的值”。
间接运算符(*)的优先级高于+,所以*dates + 2相等于(*dates) + 2与*(dates + 2)是不相等的。
数组表示法和指针表示法
/* day_mon3.c -- uses pointer notation */
#include <stdio.h>
#define MONTHS 12

int main(void)
{
    int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int index;
    
    for (index = 0; index < MONTHS; index++)
        printf("Month %2d has %d days.\n", index +1,
               *(days + index));   // same as days[index]
    
    return 0;

/* 输出:

*/ 

days是数组首元素的地址。
这样编写程序是否有优势?不一定。编译器编译这两种写法生成的代码相同。day_mon3.c要注意的是,指针表示法和数字表示法是两种等价的方法。该例演示了可以用指针表示数组,反过来,也可以用数组表示指针。在使用以数组为参数的函数是要注意这点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值