数组指针的转换和运算问题
#include <stdio.h>
int main()
{
short *p, *q;
short arr[15] = { 0 };
p = q = arr;
p++;
printf("%d\n", p - q);
printf("%d\n", (char *)p - (char *)q);
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(*arr));
return 0;
}
结果:
1 //两指针变量相减结果表示*该指针类型*表示的数组地址之间元素个数
2 //因为short类型变量占2字节,p++地址加2,又强制转为char类型运算
30 //sizeof是一个操作符(operator),其作用是返回一个对象或类型所占的内存字节数
2 //*号为引用运算符,*arr 引用了第一个元素,内存占两字节
补充:
1:数组类型在内存上连续存放,若按字节编址则每个元素地址间隔为元素所占内存空间大小。
2:指针运算单位按照所指元素类型进行运算,比如int 类型指针变量++结果加4个字节,表示指向下一个元素。
以下为按字节编址的int数组存放形式
巩固练习:
#include <stdio.h>
int main()
{
char *p, *q;
double arr[15] = { 0 };
p = q = (char*)arr;
p=(char*)((double*)p+1);
printf("%d\n", p - q);
printf("%d\n", (int *)p - (int *)q);
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(*arr));
return 0;
}
结果:
8
2
120
8