指针和数组基本等价的缘由在于指针算术和C++内部处理数组的方式。 ——《C++PrimerPlus》第五版html
在多数状况下,C++将数组名解释为数组中第一个元素的地址。c++
int arr[10] = {1,2,3,4,5}; int *p = arr; cout<<" -------------- 3 种方式获得数组的地址 ------------------- "<<endl; cout<<"arr -> "<<arr<<endl; cout<<"&arr[0] -> "<<&arr[0]<<endl; cout<<"p -> "<<p<<endl; cout<<" -------------- 4 种方式获得数组的值 ------------------- "<<endl; cout<<"arr[1] -> "<<arr[1]<<endl; cout<<"*(arr+1) -> "<<*(arr+1)<<endl; cout<<"*(p+1) -> "<<*(p+1)<<endl; cout<<"p[1] -> "<<p[1]<<endl;
总结:数组
arrayname[i] 等价于 *(arrayname+i)
这部分参考微博:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.htmlspa
指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针3d
数组指针:a pointer to an array,即指向数组的指针指针
还要注意的是他们用法的区别,下面举例说明。htm
int* a[4] 指针数组 对象
表示:数组a[4]是指针,指针的类型是int*,指针的指向类型是intblog
元素表示:*a[i] *(a[i])是同样的,由于[]优先级高于*ci
int (*a)[4] 数组指针
表示:a是指针的类型是int*[4], 指针的指向的类型为int()[4]
元素表示:(*a)[i]
#include<bits/stdc++.h> using namespace std; int main() { /*** 指针数组 ** <数组 pstr[3],数组的元素是指针> 三省指针:指针的类型是 int * ,指向的类型是int ,数组内每一个指针分别指向 三个字符串的首地址 ***/ char *pstr[3] = { "Socialism", "with", "Chinese" }; cout<<" pstr[0] "<<pstr[0][0]<<endl;; cout<<" pstr[1] "<<pstr[1]<<endl;; cout<<" pstr[2] "<<pstr[2]<<endl;; /*** 数组指针 ** <指针 pstr1> 三省指针:指针的类型是 int (*)[20] ,指向的类型是int()[20] ,指针指向 str1 ***/ char str1[20] = "Characteristics"; char (*pstr1)[20] = &str1; //b=&str1; cout<<" *pstr1 "<<*pstr1<<endl;; }
注意:字符串至关于一个数组常量,内容不可改变,且只能为右值,若是当作指针,便是常量指针也是指针常量
指针常量:该指针是一个常量,不可改变,指向某一个地址就不能改变,可是0指向的单元是能够改变的,通常读作常量指向
常量指针:指针的值不能改变,可是自身是一个变量,读做指向常量
数组名是数组的首地址
a)含义:
声明一个数组 : TYPE arrayname[N];
有两层含义:1.arrayname是一个数组,类型是TYPE[N]
2.array是一个常量指针,指针的类型是TYPE *,指向类型是TYPE,指向的值是数组的第0号元素,注意arrayname和数组第0号元素的地址是不一样的,arrayname是指针常量,arrayname++是错误的。
b)功能
sizeof(arrayname) &arrname | arrayname表明的是数组自己,获得的是整个数组的大小 此时 &arrname 表示的是 指向是整个数组 |
*arrayname (等同 arrayname[0]) | arrayname表明的是指针,获得的是数组第0号元素的值 |
arrayname+i | arrayname表明的是指针,获得的是指针向后偏移i个指向类型的单位的指针 |
补充:sizeof(对象)测出的都是对象自身的类型大小