最近看到了有关数组和指针的内容,对知识进行一下梳理总结,有任何问题欢迎交流。
数组和指针一个重要的关系就是:数组名代表的是数组第一个元素的地址。
1.一维数组:
int main()
{
int a[4]={1,2,3,4};
int *p=a;
int *q=&a[0];
}
这里的指针p与q指向的都是数组的第一个元素(a[0])。
2.二维数组:
int main()
{
int a[3][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};
int *p=a;//错误
int *q=a[0];//正确
}
二维数组很重要的一个概念就是:他是数组的数组,也就是数组的每一个元素还是数组。
int *p=a;//错误,正确写法为 int(*p)[4]=a;
错误原因:二维数组名a代表的是二维数组第一个元素a[0]={1,2,3,4}的地址,而指针p指向的是int型的数据,所以错误。
int *q=a[0];//正确
正确原因:a[0]是二维数组第一个元素的名字,他指向的是a[0]中第一个元素a[0][0]的地址,他相当于
int *q=&a[0][0];
a[i][j]=*(*(a+i)+j);
对于上面这行代码,我的理解是:
a+i 指的是a[i]的地址,*(a+i)等价于a[i]; 而a[i]指的又是a[i]第一个元素的地址,所以上述代码成立。
3.关于数组元素的遍历
#include<iostream>
using namespace std;
int main()
{
//使用关键字auto,不用注意元素的类型
int ia[2][2]={{1,2},{1,2}};
for(auto p=ia;p!=ia+2;++p)
for(auto q=*p;q!=*p+2;++q)
{
cout<<*q<<endl;
}
}
#include<iostream>
using namespace std;
int main()
{
//使用关键字decltype
int ia[2][2]={{1,2},{1,2}};
int(*a)[2]=ia;
int*b=*ia;
for(decltype(a) p=ia;p!=ia+2;++p)
for(decltype(b) q=*p;q!=*p+2;++q)
{
cout<<*q<<endl;
}
}
#include<iostream>
using namespace std;
int main()
{
//使用关键字decltype
int ia[2][2]={{1,2},{1,2}};
for(auto p=begin(ia);p!=end(ia);++p)
for(auto q=begin(*p);q!=end(*p);++q)
{
cout<<*q<<endl;
}
}
上面的方法大同小异,我只不过练习一下不同关键字的使用方法。
(PS:auto真的很好用!)
欢迎各位留言交流。