利用指针访问数组元素
int *p=arr;
arr为数组首地址,指针p指向数组的首地址。
p++;
指针后移,移到下一个元素
大家可能会有疑问,p++为什么会准确移动到下一个元素,对于这个问题起初我也是很迷惑。后来仔细想了想,p++的实际含义是在当前p所指向的地址处(也就是&xxx
)加上p指针数据类型的字节数。
示例:
//note 指针和数组
void PointPinAndArray()
{
int arr[5] = {1,2,3,4,5};
//p指针用来指向数组的地址
int *p=arr;//指向数组的首地址,arr为数组首地址
cout<<"第一个元素:"<<*p<<endl;
cout<<"第一个元素地址:"<<p<<endl;
p++;
cout<<"下一个元素:"<<*p<<endl;
cout<<"下一个元素地址:"<<p<<endl;
}
int数组可以通过指针遍历,那其他数组也可以?带着这个疑问,我尝试使用char类型指针,进行测试。
示例:
char charArr[5] = {'a','b'};
char *char_p;
char_p=charArr;
cout<<"字符数组第一个元素:"<<*char_p<<endl;
cout<<"字符数组第一个元素地址:"<<char_p<<endl;
char_p++;
cout<<"字符数组第一个元素:"<<*char_p<<endl;
cout<<"字符数组第一个元素地址:"<<char_p<<endl;
在上面的代码中,输出的元素地址结果竟然是指向这个地址的字符以及它之后的字符串,并不是地址。这就另我纳闷了,我无法理解这是为什么?通过查询资料,发现在c++
类似情况下,字符数组(或指向字符的指针)被解释为字符串,因此字符将作为字符串打印出来。
如果想要输出地址,只需添加一个强制转换(void *)
或 (const void*)
。
修改后:
char charArr[5] = {'a','b'};
char *char_p;
char_p=charArr;
cout<<"字符数组第一个元素:"<<*char_p<<endl;
cout<<"字符数组第一个元素地址:"<<(const void*)char_p<<endl;
char_p++;
cout<<"字符数组第一个元素:"<<*char_p<<endl;
cout<<"字符数组第一个元素地址:"<<(const void*)char_p<<endl;
问题来了,void *是什么?可以看这篇文章:C++基础入门 - void *与void是什么呢 - 麦瑞克博客 (unitymake.com)
本文所有案例代码: