|
发表于 2014-11-28 10:32:57
|
显示全部楼层
这其实是一个很好的题目。不要认为他是错的。这里面涉及到很多隐藏的类型转换。
就拿这道题目来看
#include <stdio.h>
void main ()
{
int *p[6]={1,2,3,4,5,6};
int c,a,d;
c=p[3];
a=p[1];
d=p[3]-p[1];
printf("%d\n%d\n",c-a,d);
}
在c=p[3]; a=p[1];中 涉及到了一个 int* 强制转换int类型 c=4 a=2
在d=p[3]-p[1]; 中 先进行指针的相减 指针的相减对同一个数组来说有意义 对不同数组来说没有意义 这里的话 相当于 (int* (4) - int* (2)) / (sizeof(int)) = int*(0) 再进行一次强制转换 转换为int 0
所以如果在数据中 int *p[6]={1,2,3,6,5,6};
那么 (int* (6) - int* (2)) / (sizeof(int)) = int*(1) 再进行一次强制转换 转换为int 1
而如果为
#include <stdio.h>
void main ()
{
char *p[6]={1,2,3,4,5,6};
char c,a,d;
c=p[3];
a=p[1];
d=p[3]-p[1];
printf("%d\n%d\n",c-a,d);
}
在d=p[3]-p[1]; 中 先进行指针的相减 指针的相减对同一个数组来说有意义 对不同数组来说没有意义 这里的话 相当于 (char* (4) - char* (2)) / (sizeof(char)) = char*(2) 再进行一次强制转换 转换为 char 2
结论: 这种指针相加减的时候要考虑到他的类型 就相当于一个基 long* +1 说明是4个字节的跨度 |
|