软件工程师面试宝典下的一道数组指针题
程序员面试宝典上的一道数组指针题
既然a是数组指针(也就是个指针),为什么输出v[2][10]的首元素不用*a而用**a呢,难道a是个指向指针的指针?若是,那么a指向的是哪个指针?打印*a的值是个地址,是不是a指针指向指针*a?
------解决方案--------------------
你要明确理解,a数组是一个指针数组,是一个1维数组,每个元素保存的都是一个地址。
至于a,如果int a[10],a可以看成是数组a的首地址,那么在指针数组里面也是一样的道理
------解决方案--------------------
int v[2][10] = {{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}};
int (*a)[10] = v;
cout<<"**a "<<**a<<endl;
cout<<"*a "<<*a<<endl;
cout<<"**(a+1) "<<**(a+1)<<endl;
cout<<"*(*a+1) "<<*(*a+1)<<endl;
cout<<"*(a[0]+1) "<<*(a[0]+1)<<endl;
cout<<"*(a[1]) "<<*(a[1])<<endl;
cout<<"a[1][4] "<<a[1][4]<<endl;
cout<<"*(*(a+1) +4) "<<*(*(a+1) +4)<<endl;
cout << endl << endl;
cout<<"**v "<<**v<<endl;
cout<<"*v "<<*v<<endl;
cout<<"**(v+1) "<<**(v+1)<<endl;
cout<<"*(*v+1) "<<*(*v+1)<<endl;
cout<<"*(v[0]+1) "<<*(v[0]+1)<<endl;
cout<<"*(v[1]) "<<*(v[1])<<endl;
cout<<"v[1][4] "<<v[1][4]<<endl;
cout<<"*(*(v+1) +4) "<<*(*(v+1) +4)<<endl;
这样结果是一样的,所以不要被int (*a)[10] = v;这句迷惑了。这句话的意义仅是告诉编译器a是双重指针,你把这句话换成int *a = v;编译器会提示无法转换的错误。
------解决方案--------------------
------解决方案--------------------
要理解数组指针,首先要理解数组。
如果有数组arr[2],那么arr是什么呢?
arr是数组的首地址,当然可以理解为指针,指向的是数组的元素arr[0].
所以*arr则为arr[0].
现在看数组指针int (*a)[10] = v;
a指向的是一个数组,*a取出指向的内容,
当然取到了一个数组{1,2,3,4,5,6,7,8,9,10},
那么*a本身就是上面介绍的arr,它仍然是个指针,
不过这次不是指向数组了,而是指向数组中的元素,
即指向了1.可以取出内容**a。
So:
一维数组指针是个二级指针,是个指向指针的指针。
- C/C++ code
#include <stdio.h> #include <iostream> using namespace std; int main() { int v[2][10] = {{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}}; int (*a)[10] = v; cout<<**a<<endl; cout<<*a<<endl; cout<<**(a+1)<<endl; cout<<*(*a+1)<<endl; cout<<*(a[0]+1)<<endl; cout<<*(a[1])<<endl; cout<<a[1][4]<<endl; cout<<*(*(a+1) +4)<<endl; return 0; }
既然a是数组指针(也就是个指针),为什么输出v[2][10]的首元素不用*a而用**a呢,难道a是个指向指针的指针?若是,那么a指向的是哪个指针?打印*a的值是个地址,是不是a指针指向指针*a?
------解决方案--------------------
你要明确理解,a数组是一个指针数组,是一个1维数组,每个元素保存的都是一个地址。
至于a,如果int a[10],a可以看成是数组a的首地址,那么在指针数组里面也是一样的道理
------解决方案--------------------
int v[2][10] = {{1,2,3,4,5,6,7,8,9,10},{11,12,13,14,15,16,17,18,19,20}};
int (*a)[10] = v;
cout<<"**a "<<**a<<endl;
cout<<"*a "<<*a<<endl;
cout<<"**(a+1) "<<**(a+1)<<endl;
cout<<"*(*a+1) "<<*(*a+1)<<endl;
cout<<"*(a[0]+1) "<<*(a[0]+1)<<endl;
cout<<"*(a[1]) "<<*(a[1])<<endl;
cout<<"a[1][4] "<<a[1][4]<<endl;
cout<<"*(*(a+1) +4) "<<*(*(a+1) +4)<<endl;
cout << endl << endl;
cout<<"**v "<<**v<<endl;
cout<<"*v "<<*v<<endl;
cout<<"**(v+1) "<<**(v+1)<<endl;
cout<<"*(*v+1) "<<*(*v+1)<<endl;
cout<<"*(v[0]+1) "<<*(v[0]+1)<<endl;
cout<<"*(v[1]) "<<*(v[1])<<endl;
cout<<"v[1][4] "<<v[1][4]<<endl;
cout<<"*(*(v+1) +4) "<<*(*(v+1) +4)<<endl;
这样结果是一样的,所以不要被int (*a)[10] = v;这句迷惑了。这句话的意义仅是告诉编译器a是双重指针,你把这句话换成int *a = v;编译器会提示无法转换的错误。
------解决方案--------------------
------解决方案--------------------
要理解数组指针,首先要理解数组。
如果有数组arr[2],那么arr是什么呢?
arr是数组的首地址,当然可以理解为指针,指向的是数组的元素arr[0].
所以*arr则为arr[0].
现在看数组指针int (*a)[10] = v;
a指向的是一个数组,*a取出指向的内容,
当然取到了一个数组{1,2,3,4,5,6,7,8,9,10},
那么*a本身就是上面介绍的arr,它仍然是个指针,
不过这次不是指向数组了,而是指向数组中的元素,
即指向了1.可以取出内容**a。
So:
一维数组指针是个二级指针,是个指向指针的指针。