1.指针取地址:可以是数组名,可以是数组首地址&arr[0]
2.指针偏移完后记得回到数组首地址
#include <stdio.h>
int main()
{
int arr[3] = {1,2,3};
int *p;
int i;
p = arr; // 数组名就是数组的首地址
// p = &arr[0] 数组的首地址就是首个元素的地址
for(i=0;i<3;i++)
{
//printf("address:0x%p, %d \n",(p+i),*(p+i));//p的偏移
printf("%d ",*p);
p++; //数组的偏移
}
printf("\n");
p = arr; // 回到首地址
for(i=0;i<3;i++){
printf("%d ",*p++);
}
return 0;
}
3.1 数组名代表常量指针,而指针p代表指针变量,从而在进行指针数组名偏移时是实现不了的
只有指针变量进行偏移行得通。
3.2 在操作系统中,凡是指针都用 8个字节表示一个地址
#include <stdio.h>
int main()
{
int arr[3] = {1,2,3};
int *p = arr;
int i;
printf("%d \n",*arr); //数组名为首地址
printf("sizeof arr is %d\n",sizeof(arr)); //3*4=12
printf("sizeof arr is %d\n",sizeof(p)); //os 用8个字节表示一个地址
printf("sizeof int is %d\n",sizeof(int)); //整型4个字节
printf("sizeof pointer is %d\n",sizeof(int*)); //os 用8个字节
printf("sizeof pointer is %d\n",sizeof(char*)); // os 用8个字节
for(i=0;i<3;i++){
printf("%d ",p[i]);
}
putchar('\n');
for(i=0;i<3;i++)
{
printf("%d ",*(arr+i)); //可遍历
}
/* for(i =0;i<3;i++){
printf("%d ",*arr++); 编译不过,因为数组名是指针常量
}
putchar('\n');
*/
return 0;
}