C语言笔记第八章指针类型转换
第八章指针类型转换
当我们初始化或赋值一个指针时,赋值号的左边是指针,赋值
值号的右边是指针表达式。在我们前面的例子中,大多数情况下,指针
的类型与指针表达式的类型相同,指针指向的类型与指针表达式
指向的类型相同。
例14:
1。浮点f = 12.3
2 .float * fptr = & f;
3 .int * p;
在上面的例子中,如果我们想让指针P指向实数F,应该怎么做?是下面的
语句吗?
p = & f;
不会。因为指针P的类型是int*,所以它所指向的类型是int。表达式&f的结果是一个类型为float*的
指针,其类型为float。两者不一致,直接赋值的
方法是行不通的。至少在我的MSVC++6.0上,指针的赋值语句要求赋值号两边的类
类型一致,所指向的类型也一致。我没有在其他编译器上试过,你可以试试。为了
达到我们的目的,我们需要进行“强制类型转换”:
p =(int *)& f;
如果有一个指针p,我们需要把它的类型和所指向的类型改成TYEP*和TYPE。
那么语法格式是:
(type *)p;
这种强制类型转换的结果是一个新指针,它的类型是TYPE*,它所指向的类型是TYPE,它所指向的地址是原指针所指向的地址。而原始指针p
的所有属性都没有被修改。
如果一个函数使用指针作为参数,那么指针类型也会在函数调用语句的实参和形参结合的过程中进行转换
。
例15:
void fun(char *);
int a=125,b;
fun((char *)& a);
...
...
void fun(char * s)
{
char c;
c = *(s+3);*(s+3)= *(s+0);*(s+0)= c;
c = *(s+2);*(s+2)= *(s+1);*(s+1)= c;
}
}
注意这是一个32位的程序,所以int类型占用4个字节,char类型占用1个字节。函数
fun用于反转一个整数的四个字节的顺序。你注意到了吗?在函数调用
语句中,参数&a的结果是一个类型为int *的指针,它所指向的类型是int。这个指针的类型是char*,它所指向的类型是char。这样,在组合实参和形参的过程中
,就必须进行从int* type到char* type的转换。有了这个例子,我们可以
这样想象编译器的转换过程:编译器先构造一个临时指针char*temp,
然后执行temp=(char*)&a,最后把temp的值传递给S,那么最后的结果就是:S的
类型是char*,它指向的类型是char,它指向的地址是a的第一个地址。
0条评论