a和&a的区别,及指针数组和数组指针的简单理解:
以代码的形式解释:
#include <iostream>
using namespace std;
int main()
{
//a是数组时,a 和 &a的区别
int a[5] = { 1,2,3,4,5 };
int *ptr1 = (int *)(&a+1);
ptr1--;
cout << *(a + 1)<<" ";
cout << *(ptr1) << endl;
//输出:2 5
/*
结果 5 解释如下:
a是指向数组a的首地址,而&a指向了整个数组a
所以 &a+1 指向了整个数组后面哪一位(也就是a[4]后面的位置)
由此可以&a可以写成下面形式: int(*p)[5] = &a;
*/
int(*p)[5] = &a;
int *tptr = (int *)(&a+1 );
cout << p + 1 << " " << tptr << endl;
//输出:0095FAE4 0095FAE4
//由此的确证明了 int(*p) [5] = &a
/*
那int(*p)[3]与int* p[3]的区别是什么呢(即指针数组和数组指针的区别):
int(*p)[3] 定义了一个指针变量p,这个指针变量指向了一个含有三个int类型的数组,
这个指针称为 数组指针,也叫行指针
int* p[3] 定义了一个数组p,这个数组里面有三个int类型的指针变量(p[0]、p[1]、p[2])
这样的数组称为 指针数组
int(*p)[3]中 p+1将指向下一行的数组,如果没有下一行,就会执行这一行最后一个元素的后面
因此可以用p[0]来表示这一行,p[0][i]获取这一行中的数,
由于只有一行,所以用p[1][i]就会输出不对,下面实践证明:
*/
cout << p[0][1] <<" "<<p[0][2]<<" 不存在第二行的情况:"<<p[1][0]<< endl;
//输出结果: 2 3 不存在第二行的情况:-858993460
//int b[3][3] = { 1,2,3,4,5,6,7,8,9 };
//int (*ptr2)[3];
//ptr2 = &b[1];
//ptr2++;
//cout << ptr2 [0][1]<<"\t"<< ptr2[1][1] << endl;
return 0;
}