[c/c++]指针(2)

时间:2021-01-30 19:23:24

首先呢,讲讲数组

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

1 | 2 | 3 | 4 | 2 |

0  1  2  3  4  

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

int a[] = {, , , , };
int *p = &a[];

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

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

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

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

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

#include<iostream>
using namespace std;
int main(){
int a[] = {, , , , };
int *p = &a[];
p += sizeof(int);
cout<<*p;
return ;
}

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

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

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

再次改改:

#include<iostream>
using namespace std;
int main(){
int a[] = {, , , , };
int *p = &a[];
cout<<*(p + );
return ;
}

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

 #include<iostream>
using namespace std;
int main(){
int a[] = {, , , , };
int *p = &a[];
cout<<p[];
return ;
}

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

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


指针与数组

new关键字申请数组:

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

就如此简单

malloc函数:

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

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

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