C++ 指针 vs 数组

返回上一级

C++ 中的指针和数组是密切相关的,指针和数组在很多情况下是可以互换的

一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组

/**
 * file: main.cpp
 * author: 简单教程(www.twle.cn)
 *
 * Copyright © 2015-2065 www.twle.cn. All rights reserved.
 */

#include <iostream>

const int LEN = 5;

int main ()
{
    int  arr[LEN] = {8, 16, 32,64,128};

    // 指针中的数组地址
    int  *ptr = arr;


    ptr = arr;
    for (int i = 0; i < LEN; i++)
    {
        std::cout << "arr[" << i << "]的内存地址为 ";
        std::cout << ptr << std::endl;

        std::cout << "var[" << i << "] 的值为 ";
        std::cout << *ptr << std::endl;

        // 移动到下一个位置
        ptr++;
    }

    return 0;
}

编译和运行以上范例,输出结果如下

arr[0]的内存地址为 0x7ffee42c91e0
var[0] 的值为 8
arr[1]的内存地址为 0x7ffee42c91e4
var[1] 的值为 16
arr[2]的内存地址为 0x7ffee42c91e8
var[2] 的值为 32
arr[3]的内存地址为 0x7ffee42c91ec
var[3] 的值为 64
arr[4]的内存地址为 0x7ffee42c91f0
var[4] 的值为 128

但是

指针和数组并不是完全互换的,就是数组变量是不能做自增自减和加减法赋值给自己

/**
 * file: main.cpp
 * author: 简单教程(www.twle.cn)
 *
 * Copyright © 2015-2065 www.twle.cn. All rights reserved.
 */

#include <iostream>

const int LEN = 5;

int main ()
{
    int  arr[LEN] = {8, 16, 32,64,128};

    for (int i = 0; i < MAX; i++)
    {
        *arr = i;    // 这是正确的语法
        arr++;       // 这是不正确的
    }

    return 0;
}

把指针运算符 * 应用到 var 上是完全可以的,但修改 var 的值是非法的

因为 var 是一个指向数组开头的常量,不能作为左值

因为一个数组名对应一个指针常量,只要不改变数组的值,仍然可以用指针形式的表达式

*(arr + 2) = 500;

上面的语句是有效的,且能成功编译,因为 var 未改变

返回上一级

C++ 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.