一维数组
1.数组名等价于一个常量指针,指向数组的第一个元素。
string nums[] = {"one","two","three"};
string *p = nums;
string *p2 = &nums[0];
2. 使用begin()和end()函数取得相应的指针
int ia[]= {0,1,2,3};
int *beg = begin(ia);
int *last = end(ia); //返回尾元素下一位置的指针
多维数组
一般情况
多维数组是数组的数组,所以指针指向第一个内层数组。
ia一般当成是是第一个 内层数组[4] 的整体地址。&ia当成一个整体数组[3][4]的地址。
//一般情况
int ia[3][4]; //有3个一维数组
int (*p)[4] = ia;
p = &ia[2];
p = ia + 1;
cout<< ia <<endl; //0x22fe10
cout<< ia+1 <<endl; //0x22fe20, 通过这两句说明ia当成指向第一个内层数组的指针
cout<< (&ia) + 1 <<endl; //0x22fe40, &ia当成一个大小为48的二维数组的地址
int (*p2)[3][4] = &ia;
解释:理解这些为啥等价很简单,*相当于降级,&相当于升级,相互抵消。而ia[2] 相当于 *(ia+2),相当于第二个数组元素的头元素的地址。
遇到sizeof()
//sizeof情况
cout<<sizeof(ia)<<endl; //48,没把数组名当指向第一个数组元素的指针,也没把他当成一个大小为16字节的内层数组
cout<<sizeof(ia[2])<<endl; //16
cout<<sizeof(ia+2)<<endl; //8 把ia + 2当成一个指针运算,所以ia+2整体是一个指针int(*)[4]
解释:sizeof一般尽量保留数组的数组属性,不会改变愿意。