[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));
接下来就可以像上面那样使用了
好处:省内存(不用直接把数据范围写进去)