c/c++语言奇葩之一 是指针的
形式逻辑不成立。外貌相同的形式,在语句里的意思不同于在声明里的意思。
必须分清,事情发生在声明里,还是语句里。
int *p; // 这是声明,*p 声明 p 是指针,p 只能用来指向 int 型地址
int *p=arr; // 这是声明加初始化,*p 声明p 是指针,p 只能用来指向 int 型地址,初始化让它指向数组arr 的 首地址,也就是 p=&arr[0];
*p++; // 这是语句,*p 是 p指向的存储单元里的值,现在要 自增1。也就是执行了 arr[0]=arr[0]+1;
p++; // 这是语句,p 是地址, p++ 是 "p 的地址 加 sizeof(int)"
printf("%d\n",arr); // 这是语句,arr 不是指针,而是数组,
你要想打印地址: printf("%u\n", &arr[0]); 或 printf("%p\n", &arr[0]);
你要想打印第一个元素的值: printf("%d\n", arr[0]);
语句里有恒等式: arr[i] = *(arr + i); 指针 与 数组 的 恒等 关系。
你要想打印第i个元素的值: printf("%d\n", arr[i]); 或 printf("%d\n", *(arr + i) );
同样,语句里有恒等式:*(p+i) = p[i]; (这是数值)
加上你初始化声明了 p=arr,所以语句里有 :*(p+i) = p[i] = arr[i] 的数值关系 (是数值)
搞通了这些基本概念,你的问题便可迎刃而解了。