zoukankan      html  css  js  c++  java
  • [c/c++]指针(2)

    首先呢,讲讲数组

    数组就是一连串的地址对不对?所以它们的地址是紧挨着的

    1 | 2 | 3 | 4 | 2 |

    0  1  2  3  4  

    那我们把一个数组的首地址赋给一个指针变量

    int a[100] = {1, 2, 3, 4, 2};
    int *p = &a[0];

    我们输输*p,很容易就能发现它是数组的0号下表

    那如果要利用p去输输a[1]怎么输呢?

    #include<iostream>
    using namespace std;
    int main(){
        int a[100] = {1, 2, 3, 4, 5};
        int *p = &a[0];
        int address = (int)&a[0];
        p = ( int * )(address + sizeof(int));
        cout<< *p;
        return 0;
    }

    运行结果是2,说明指针类型可以被强转成整型

    可是这样十分地嘛烦,那看看下面这段代码

    #include<iostream>
    using namespace std;
    int main(){
        int a[100] = {1, 2, 3, 4, 5};
        int *p = &a[0];
        p += sizeof(int);
        cout<<*p;
        return 0;
    }

    运行看看,貌似可以惊讶的发现结果是5

    这是因为指针的加减运算中匿藏了*的运算

    可能是因为为了防止出现前3个字节在这个a[0],而后1个字节却在a[1]的情况吧

    再次改改:

    #include<iostream>
    using namespace std;
    int main(){
        int a[100] = {1, 2, 3, 4, 5};
        int *p = &a[0];
        cout<<*(p + 1);
        return 0;
    }

    现在对了,其实还可大胆地进行尝试:

    1 #include<iostream>
    2 using namespace std;
    3 int main(){
    4     int a[100] = {1, 2, 3, 4, 5};
    5     int *p = &a[0];
    6     cout<<p[1];
    7     return 0;
    8 }

    既没有编译错误,也没有运行错误

    还是有一个2孤独地摆在命令行中间


    指针与数组

    new关键字申请数组:

    int n;
    cin>>n;
    int *a = new int[(const int)(n + 1)];

    就如此简单

    malloc函数:

    int n;
    cin>>n;
    int *a = ( int * )malloc(sizeof(int)*(n+1));

    接下来就可以像上面那样使用了

    好处:省内存(不用直接把数据范围写进去)

  • 相关阅读:
    upload.go
    heartbeat.go
    delete.go
    get.go
    handler.go
    uuid.go
    kingpin_parser.go
    disk.go
    logrus_hook.go
    反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例
  • 原文地址:https://www.cnblogs.com/yyf0309/p/5661795.html
Copyright © 2011-2022 走看看