Point_2


#include <iostream>

using std::cout;
using std::endl;

int main()
{
    int a[5] = {0, 1, 2, 3, 4};
    int *p = a;

    for(int i = 0; i < 5; i++)
    {
        // 这句话与下面的两句话效果一样
        // cout << *p++ << '\t';

        cout << *p << '\t';
        p++;
    }
    cout << endl;

    p = a;
    for(int i = 0; i < 5; i++)
        cout << *(p + i) << '\t';
    cout << endl;

    for(int i = 0; i < 5; i++)
        cout << *(a + i) << '\t';
    cout << endl;

    for(int i = 0; i < 5; i++)
        cout << p[i] << '\t';
    cout << endl;
    cout << endl;


    int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
    int *pArr = &arr[0][0];
    for(int i = 0; i < 9; i++)
        cout << *pArr++ << " ";
    cout << endl;

    // 输出每行的首地址及所有的元素值
    // 由于数组在内存的地址是由操作系统动态分配,
    // 因此,实际输出的各行首地址并不会从假设的1000到1035。
    // 各行的首地址可能会相差很大
    for(int i = 0; i < 3; i++)
    {
        cout << "arr[" << i << "]=" << arr[i] << "=" << &arr[i][0] << endl;     // i行的行首地址
        cout << "arr[" << i << "]=" << arr + i << endl;         // i行的行首地址
        cout << *(arr[i]) << endl;      // i行第一个元素的值
        cout << *(arr + i) << endl;     // i行的行首地址
        for(int j = 0; j < 3; j++)
            cout << "arr[" << i << "][" << j << "]=" << *(arr[i] + j) << "=" << arr[i][j] << endl;
    }

    // C++中引入了行地址的概念,并规定二维数组a中的第i行地址用a+i或&a[i]表示,行地址的值与行
    // 首地址的值是相同的,即:a+i = &a[i] = a[i] = &a[i][0],但两者类型不同,所以行地址只能用于
    // 指向以为数组的指针变量,而不能用于普通指针变量,例如:
    // int a[3][3];
    // int *p = a + 0;      // 编译错误,提示用户pa+0的类型不同,
    // 如果要将行地址赋给普通指针变量,必须用强制类型转换,int *p = (int*)(a+0);

    // 二维数组名a可用于表示二维数组的首地址,但C++规定该首地址并不是二维数组中第0行第0列的地址
    // 即(a != a[0][0]),而是第0行的地址:a = a + 0 = &a[0];

    // 二维数组第i行首地址有三种表示方法:a[i], *(a+i), &a[i][0];
    // i行第j列元素a[i][j]的地址有四种表示方法
    // a[i] + j, *(a+i)+j, &a[i][0]+j, &a[i][j]
    // i行第j列元素a[i][j]值也有4中表示方法
    // *(a[i]+j), *(*(a+i)+j), *(&a[i][0]+j), a[i][j]

    // 行地址、元素地址、元素值 表示方式
    // i行行地址 a+i、&a[i]
    // i行首地址(第i行第0列地址) a[i]、 *(a+i)、 &a[i][0]
    // 元素a[i][j]的地址 a[i]+j 、*(a+i)+j 、&a[i][0]+j、&a[i][j]
    // i行第j列元素值 *(a[i]+j) 、 *(*(a+i)+j) 、 *(&a[i][0]+j)、a[i][j]

    cout << endl;
    cout << endl;

    for(int i = 0; i < 3; i++)
    {
        // i行行地址,行地址是一个二级指针
        cout << "&arr[" << i << "]=" << &arr[i] << " = " << arr + i << endl;

        // i行行首地址,行首地址是普通指针
        cout << "arr[" << i << "]=" << arr[i] << " = " << *(arr + i) 
            << " = " << &arr[i][0] << endl;

        for(int j = 0; j < 3; j++)
        {
            // 元素a[i][j]的地址
            cout << "&arr[" << i << "][" << j << "]=" << arr[i] + j << " = "
                << *(arr + i) + j << " = " << &arr[i][0] + j << " = " 
                << &arr[i][j] << endl;
            // 元素a[i][j]的值
            cout << "arr[" << i << "][" << j << "]=" << *(arr[i] + j) << " = "
                << *(*(arr + i) + j) << " = " << *(&arr[i][0] + j) << " = " 
                << arr[i][j] << endl;
        }
    }

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值