[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));

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

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

原文地址:https://www.cnblogs.com/yyf0309/p/5661795.html