7. 指针的索引运算

在 C 语言中,可以用数组中数据元素类型的指针来指向数组的起始地址,也可以指向任何一个数据元素的地址。那指针能否向数组一样使用索引运算符([])来进行索引运算呢,如果能这样用那真是太方便了。答案是可以这样做。我们来看 指针的索引运算 的语法

语法

指针[整数表达式]

说明

  1. 指针的索引运算 的规则和一维数组索引运算的规则完全相同。
  2. 在语法中,指针 p 的整数表达式索引 n 组成的表达式 p[n] 等同于 *(p+n)
  3. 指针的索引运算 返回的是指针指向的位置起的第 n 个数据元素的引用。

示例

// filename: pointer_index.c
#include <stdio.h>

int main(int argc, char *argv[]) {
    int scores[10] = {10, 20, 30, 40};
    int *p = scores;  // 用指针指向数组的起始位置

    printf("---访问数组中第一个数据元素---\n");
    printf("scores[0]: %d\n", scores[0]);
    printf("p[0]: %d\n", p[0]);
    printf("*p: %d\n", *p);

    printf("---访问数组中第三个数据元素---\n");
    printf("scores[2]: %d\n", scores[2]);
    printf("p[2]: %d\n", p[2]);
    printf("*(p+2): %d\n", *(p+2));

    return 0;
}

运行结果如下

weimingze@mzstudio:~$ gcc -o pointer_index pointer_index.c
weimingze@mzstudio:~$ ./pointer_index
---访问数组中第一个数据元素---
scores[0]: 10
p[0]: 10
*p: 10
---访问数组中第三个数据元素---
scores[2]: 30
p[2]: 30
*(p+2): 30

从上面的示例的运行结果可以看出。指针也可以象数组一样使用索引表达式运算。并且规则完全相同。

数组索引和指针索引的区别:

  1. 数组的名称是常量,它的类型依然数组。只是数组名表达式的返回值是指针。
  2. 指针变量,它的类型是指针,指针可以随时改变指向的位置。
  3. sizeof 运算符对数组求长度得到的是数组占用内存的字节数。
  4. sizeof 运算符对指针求长度得到的是指针的长度( 4 或 8 字节)。

实验: