c语言学习中对指针的理解

#include <bits/stdc++.h>
using namespace std;
int main() {
    int a[3] = {1, 2, 3};
    int b[2][3] = {1, 2, 3, 4, 5, 6};
    cout << a[2] << " " << *(a + 2) << endl;//a[2] = *(a+2),a代表了指向a[0]地址的一个指针,解引用(a+2)相当于把a[0]的地址向后移动了两个单位长度
    //也就值sizeof(int)的值,就指向了a[2]的地址,单位长度是多少是根据定义的指针类型决定的
    int *point_a = a;
    cout << point_a + 2 << " " << &a[2] << endl; //point_a = &a[2],point_a+2代表了a[2]的地址
    //point_a可以自增,是指针运算,而a不行

    //对于b
    cout << b << " " << &b[0] << endl;   //b是一个指向一维数组的指针,指向了b[0]的地址,等于直接对b[0]取地址
    cout << *(b + 1) << " " << b[1] << " " << &b[1][0] << endl;//*(b + 1)等于把b这个指针移动了一个单位长度,这个单位长度是指向二维数组的长度
                                                               //也就是说,从b[0]的层面上到了b[1],将跳跃3个int长度,因为每个二维数组
                                                               //中含了三个一维数组,移动了一个单位长度后解引用,就找到了b[1],因为
                                                               //b本身就是一个指向一维数组的指针,解引用后就变成指向了整型变量的指针
                                                               //即,b[1]是一个指向整型变量的指针,指向了b[1][0]的地址
                                                               //事实上,b[1]的地址和b[1][0]的地址是相同的
                                                               //我们就可以直接把*b看作b[0],*(b+1)=b[1]
    cout << *(b + 1) + 2 << " " <<b[1] +2 << " " << &b[1][2] << endl;//*(b + 1) + 2 = b[1]+2,上面提到,b[1]是一个指向b[1][0]
                                                                     //的地址的整形指针,每次自增也仅仅增加一个int的长度,也就是
                                                                     //指向了b[1][2]的地址
    cout << *(*b + 2) << " " << *(b[0]+2) << " " << b[0][2] << endl; //再次解引用就得到了真正的元素
}

a[2] = *(a+2),a代表了指向a[0]地址的一个指针,解引用(a+2)相当于把a[0]的地址向后移动了两个单位长度
也就值sizeof(int)的值,就指向了a[2]的地址,单位长度是多少是根据定义的指针类型决定的
point_a = &a[2],point_a+2代表了a[2]的地址
point_a可以自增,是指针运算,而a不行
对b
b是一个指向一维数组的指针,指向了b[0]的地址,等于直接对b[0]取地址
(b + 1)等于把b这个指针移动了一个单位长度,这个单位长度是指向二维数组的长度,也就是说,从b[0]的层面上到了b[1],将跳跃3个int长度,因为每个二维数组 ,中含了三个一维数组,移动了一个单位长度后解引用,就找到了b[1],因为,b本身就是一个指向一维数组的指针,解引用后就变成指向了整型变量的指针,即,b[1]是一个指向整型变量的指针,指向了b[1][0]的地址。事实上,b[1]的地址和b[1][0]的地址是相同的,我们就可以直接把b看作b[0]。
(b+1)=b[1]//(b + 1) + 2 = b[1]+2,上面提到,b[1]是一个指向b[1][0]的地址的整形指针,每次自增也仅仅增加一个int的长度,也就是指向了b[1][2]的地址
再次解引用就得到了真正的元素
二维数组内存代表图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值