(1)指针数组本质上是一个数组,指针是数组中的内容,表示数组中的每一个元素都是指针,所以指针数组就是存放指针的数组。下面是指针数组的用法:面试
1 int a = 10, b = 20; 2 int *p[3]; 3 p[0] = &a; 4 p[2] = &b;
(2)指针数组的定义能够抽象为:指向变量类型 * 数组名称[数组长度]。数组
(3)[]的优先级高于*,因此[]与p先结合,说明p是一个数组,长度为3,其数组元素的类型是int *。spa
(1)数组指针本质上是一个指针,数组是指针指向的类型,表示指针指向一个数组,所以数组指针就是指向数组的指针。下面是数组指针的用法:指针
1 int a[3] = { 1,2,3 }; 2 int (*p)[3]; 3 p = &a;
(2)数组指针的定义能够抽象为:数组元素类型 (* 指针名称)[数组长度]。code
(3)()使得*与p先结合,因此p是一个指针,盖掉(*p)剩下的就是指针指向的内容了即int[3]。blog
(4)数组指针指向整个数组a(取地址&a),而非数组a的首元素(取地址a),虽然数组a和数组a中首元素的地址相同。get
请写出下面程序的输出结果(假设数组a的地址&a为0x001DF720)class
1 int main(int argc, char *argv[]) { 2 //数组指针和二维数组的区别 3 int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} }; 4 int(*p)[5] = a; 5 cout << p << endl; 6 cout << p + 1 << endl; 7 8 cout << *p << endl; 9 cout << *(p + 1) << endl; 10 cout << *p + 1 << endl; 11 12 cout << **p << endl; 13 cout << **(p + 1) << endl; 14 cout << *(*p + 1) << endl; 15 16 getchar(); 17 return 0; 18 }
知识点提示:(1)数组名始终等价于数组首元素的地址:a<=>&a[0]。变量
(2)解引用的次数等于数组的维度时,才能获得数组的元素值,如二维数组必须通过两次解引用才能获得数组的元素值。引用
(3)数组首元素地址和数组的地址虽然位置同样,可是两者彻底不是一回事(经过解引用来理解),数组首元素地址&a[0]解引用以后为*(&a[0])=a[0],是首元素的值;而数组地址&a解引用以后为*(&a)=a=&a[0];经过以上说明,数组地址一次解引用以后获得数组首元素的地址,再解引用以后获得首元素的值(在一维数组的状况下)。
(4)二维数组a[n][m],能够把a[n]当作是内层[m]的数组名。
按照以上的知识和规则认真分析能够得出以下答案:
1 //数组a的地址&a为0x001DF720 2 int main(int argc, char *argv[]) { 3 int a[2][5] = { {1,2,3,4,5},{6,7,8,9,10} }; 4 int(*p)[5] = a;//a==&a[0],左右类型相同,p指向一个元素为5的一维数组 5 cout << p << endl;//两次解引用是地址,p=&a[0],0x001DF720 6 cout << p + 1 << endl;//两次解引用是地址,p+1=&a[1]=0x001DF720+4*5=0x001DF734 7 8 cout << *p << endl;//一次解引用是地址,*p=a[0]=&a[0][0],0x001DF720 9 cout << *(p + 1) << endl;//一次解引用是地址,*(p+1)=a[1]=&a[1][0],0x001DF734 10 cout << *p + 1 << endl;//一次解引用是地址,*p+1=&a[0][1]=0x001DF724 11 12 cout << **p << endl;//二次解引用是元素值,**p=a[0][0]=1 13 cout << **(p + 1) << endl;//二次解引用是元素值,**(p+1)=a[1][0]=6 14 cout << *(*p + 1) << endl;//二次解引用是元素值,*(*p+1)=a[0][1]=2 15 16 getchar(); 17 return 0; 18 }
指出下面程序中的错误:
1 int main(int argc, char *argv[]) { 2 int b[6] = { 1,2,3,4,5,6 }; 3 int *p = &b; //左右类型不匹配 4 cout << p << endl; 5 6 getchar(); 7 return 0; 8 }
知识点:数组首元素地址和数组的地址虽然位置同样,可是两者彻底不是一回事(经过解引用来理解),数组首元素地址&a[0]解引用以后为*(&a[0])=a[0],是首元素的值;而数组地址&a解引用以后为*(&a)=a=&a[0];经过以上说明,数组地址一次解引用以后获得数组首元素的地址,再解引用以后获得首元素的值(在一维数组的状况下)。
修改方式如下二选其一:
1 //方式一 2 int (*p)[6]=&b; 3 //方式二 4 int *p=b;//或者:int *p=&b[0];
写出指针数组str中四个指针元素的值。
因为题目有问题,未正确解答,故略。