/
下面一段简单的代码通过两个验证抛出对指针数组与指针的一些 疑问。
同时最后自己做了一个简单的总结与理解,刚自学希望有大神详细解答这两个验证,指点一二!
/
#include<iostream>
using namespace std;
#define N 4
void mix(int (a)[N],int m) //进行比较和交换的函数
{
int value,i,j;
for(i=0;i<m;i++)
{
value=((a+i));
for(j=0;j<N;j++)
if(((a+i)+j)<value)
value=(*(a+i)+j);
cout <<"line " << i ;
cout <<":the mix number is " << value << endl; //输出最小值
}
}
void main()
{
//验证一://为什么 p与*p 是同一个值而且是地址值, 都是代表这个二维数组a的首地址,还是有更深的解释???
int a[3][N] = {1,2,3,4,5,6,7,8,9,10,11,12};//,
int i,j;
int (*p)[N];
p= &a[0];
//p= a; 此时的a代表数组地址并没有数据类型与&效果相同
int *s;
s=a[0];
cout << "output array element:" << endl;
for(i=0;i<3;i++)
{
for(j=0;j<N;j++)
//cin >> a[i][j];
cout << a[i][j] <<",";
cout<< endl;
}
//验证开始:
cout << "输出P" << "," << p << endl;
cout << "输出*P" << "," <<* p << endl;
cout << "输出*(*P)" << "," <<*(* p) << endl;
cout << "输出s" << "," << s << endl;
cout << "输出*s" << "," <<* s << endl;
cout << "/n" << endl;
cout << "输出(P+1)" << "," << (p+1) << endl;
cout << "输出*(P+1)" << "," <<* (p+1) << endl;
cout << "/n" << endl;
cout << "输出*(P+1)" << "," << (*(p+1)) << endl;
cout << "输出*(*(P+1))" << "," <<*(* (p+1)) << endl;
/*结果如下:
output array element:
1,2,3,4,
5,6,7,8,
9,10,11,12,
输出P,003FF720
输出*P,003FF720
输出*(*P),1
输出s,003FF720
输出*s,1
/n
输出(P+1),003FF730
输出*(P+1),003FF730
/n
输出*(P+1),003FF730
输出*(*(P+1)),5
/n
*/
//为什么 p与*p与s 是同一个值而且是地址值, 都是代表这个二维数组a的首地址,s与*s 又不是同一个值,还是有更深的解释???
//验证二:// 在一维数组中,为什么q与*q 又不相等,还是有更深的解释???// t=b[0] 一维数组b[0]不能像二维数组那样代表首地址
cout << "/n" << endl;
int b[3]={13,14,15};
int* q;
int* t;
q = &b[0];
// t=b[0] 一维数组b[0]不能像二维数组那样代表首地址
cout << "output q"<<","<< q << endl;
cout << "output *q"<<","<< *q << endl;
cout << "output first address b:"<< "," <<b<<endl;
// // 在一维数组中,为什么q与*q 又不相等,还是有更深的解释???// t=b[0] 一维数组b[0]不能像二维数组那样代表首地址
/*结果如下:
output q,003FF6DC
output *q,13
output first address b:,003FF6DC
/n
*/
cout << "/n" << endl;
mix(p,3);
/*
结果如下:
line 0:the mix number is 1
line 1:the mix number is 5
line 2:the mix number is 9
Press any key to continue . . .
*/
}
/
my summary and need you correct:
1.指针数组中int (a)[N]代表的是一种储存指针的数据类型,所以a 与a 此时是相等的,
(a)才是表示元素。这是区别于正常的一维二维数组的。
2.指针数组是为了获取别人的地址,往往用取地址符&(或直接用a,是有试过), 这样可以
避免数据类型不匹配的诸多尴尬。
3.一维数组a[0],不能代表首地址这已经是元素了,可以用a代替首地址。
/
首先需要明确一点,围绕数组的很多设定都是C语言的设计bug,并且C++为了和C兼容继承了这些bug。
C/C++存在一个“数组退化”的概念(Array-to-pointer decay),数组类型对象在参与大部分运算的时候会退化成一个指向首元素的指针。所谓数组的下标运算其实都是指针在参与。
说的可能有点乱,因为我有点不能确定你的思路,所以只把我觉得可能关键的几个点说一下。
函数形参如果定义为数组类型,也会作为指针处理。所以你最开始的int (a)[N]和int *a是一样的。(另外你那个括号并没什么用,int a[N]也是一样的)
指针数组应该是int a[N],数组指针是int (a)[N]。
第二部分p和p不一样,p指向p的第一个元素也就是第一行。而p就是a的第一行,退化后是指向第一行的第一个元素的指针。p和退化的*p地址相同,但是类型不同。
我发现这里不能正常显示星号。……于是,我暂时也不知道该如何是好。