小猪的博客

偶然发现的,关于C++指针的一点注意事项

C++的指针是大一时期一直觉得头疼的一个东西。当年一直对指针敬而远之。一旦不小心,指针越界的后果就是程序崩溃……> <

然而,偶然一次学妹问到关于动态数组的问题的时候……才偶然发现当年自己学指针似乎一直没有搞清楚这两者的关系:

pointerpointer[i]

比如实现一个简单的动态数组,举例就是看如下代码:

第一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
int arrayInput;
int arraySize = 0;
int* arrayPointer;
cout<<"依次输入数字到这个数组中,输入EOF(Windows下为Ctrl+Z,Unix/Linux下为Ctrl+D)来停止输入"<<endl;
while(cin>>arrayInput){
arrayPointer[arraySize] = arrayInput;
arraySize++;
}
cout<<"现在输出数组中元素"<<endl;
for(int i = 0;i<arraySize;i++){
cout<<i<<"元素: "<<arrayPointer[i]<<" ";
}
}

第二种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;
int main(int argc, char *argv[]) {
int arrayInput;
int arraySize = 0;
int* arrayPointer;
cout<<"依次输入数字到这个数组中,输入EOF(Windows下为Ctrl+Z,Unix/Linux下为Ctrl+D)来停止输入"<<endl;
while(cin>>arrayInput){
*(arrayPointer+arraySize) = arrayInput;
arraySize++;
}
cout<<"现在输出数组中元素"<<endl;
for(int i = 0;i<arraySize;i++){
cout<<i<<"元素: "<<*(arrayPointer+i)<<" ";
}
}

直到写完了,才发现自己其实一直没有搞懂,这种arrayPointer[i]表示什么。于是做了一个测试~

1
2
3
4
5
6
7
8
cout<<"现在输出数组中元素\n第一种:"<<endl;
for(int i = 0;i<arraySize;i++){
cout<<i<<"元素: "<<arrayPointer[i]<<" ";
}
cout<<"\n第二种:"<<endl;
for(int i = 0;i<arraySize;i++){
cout<<i<<"元素: "<<*(arrayPointer + i)<<" ";
}

试验了一下,才发现,其实arrayPointer[i] 和*(arrayPointer + i) 是等价的,前者是代表从arrayPointer的首地址开始计数,而arrayPointer[0]代表就是arrayPointer指向的地址所对应的值。这一点应该注意一下(其实以前觉得数组和指针挺像的,但是从这一点就知道数组绝对是指针的一小部分子集)。

给自己提个醒吧- -顺便怀念一下远去的C++。