int *p[4]//声明指向int的指针数组
int (*p)[4] //指向数组int[4]的指针
可以这么理解: *的优先级没有[]高, 第一种情况p与[]结合,代表p是一个数组, 什么样的数组呢? int*型的数组;第二种情况是p首先和*结合,p是一个指针, 指向int [4]类型的。- 用typedef实现二位数组的遍历
-
int ia[3][4]={1,1,1,1,1,1,1,1};
typedef int intarray[4];
for(intarray *p1=ia;p1!=ia+3;p1++ )
for(int *q=*p1; q!=*p1+4; q++)
{
cout<<*q<<", ";
} -
int *p = (int *) 100;
printf("%d\n", p+100);//输出结果是多少?
p是一个指向int的指针, 强制初始化为内存地址为100的指针, p+100是p向下偏移100个int存储空间(4)后的地址, 强制转化成整形后应该输出100+100*4=500.
注意: 不能随意操纵p指向的内容.
int array[]={1,2,3,4,5};
int *p= int *(&array+1);
printf("%d%d\n", *(a+1), *(p-1));
a退化为a[0]的指针, 那么a+1就是指向a[1]的指针, 所以*(a+1)的结果是2;
&array是取int[5]的地址, 因此&array是指向int[5]的指针, &array+1就是偏移一个int[5]的地址, 值就是&array[4] + 4, p是将这个值强制转化成int *.
p-1就是p向左偏移个int地址, 就是&array[4] + 4 - 4 = & array[4], 那么 *(p-1) 的结果就是5.
注意: 指针加减整数n后的值并不是指针的值直接加减n, 而是指针偏移n个指针指向的内存;
非常感谢霞光照耀提供的学习经验,这里放在一起便于更方便看一点。
摘自:http://www.cnblogs.com/lovelyxia/archive/2010/04/23/1718964.html