asp.net 手机网站开发教程,wordpress 幻灯片设置,公司网站建设哪儿济南兴田德润实惠吗,阿里巴巴怎么建设网站当我们初始化一个指针或给一个指针赋值时#xff0c;赋值号的左边是一个指针#xff0c;赋值号的右边是一个指针表达式。在我们前面所举的例子中#xff0c;绝大多数情况下#xff0c;指针的类型和指针表达式的类型是一样的#xff0c;指针所指向的类型和指针表达式所指向…当我们初始化一个指针或给一个指针赋值时赋值号的左边是一个指 针赋值号的右边是一个指针表达式。在我们前面所举的例子中绝大 多数情况下指针的类型和指针表达式的类型是一样的指针所指向的 类型和指针表达式所指向的类型是一样的。 例十五 float f12.3; float *fptrf; int *p; 在上面的例子中假如我们想让指针p 指向实数f应该怎么办 是用下面的语句吗 pf; 不对。因为指针p 的类型是int *它指向的类型是int。表达式 f 的结果是一个指针指针的类型是float *,它指向的类型是float。 两者不一致直接赋值的方法是不行的。至少在我的MSVC6.0 上对 指针的赋值语句要求赋值号两边的类型一致所指向的类型也一致其 它的编译器上我没试过大家可以试试。为了实现我们的目的需要进 行强制类型转换 p(int*)f; 如果有一个指针p我们需要把它的类型和所指向的类型改为 TYEP *TYPE 那么语法格式是 (TYPE *)p 这样强制类型转换的结果是一个新指针该新指针的类型是 TYPE *它指向的类型是TYPE它指向的地址就是原指针指向的地址。 而原来的指针p 的一切属性都没有被修改。切记 一个函数如果使用了指针作为形参那么在函数调用语句的实参和 形参的结合过程中必须保证类型一致否则需要强制转换 例十六 void fun(char*); int a125,b; fun((char*)a); void fun(char*s) { charc; c*(s3);*(s3)*(s0);*(s0)c; c*(s2);*(s2)*(s1);*(s1)c; } 注意这是一个32 位程序故int 类型占了四个字节char 类型占一个 字节。函数fun 的作用是把一个整数的四个字节的顺序来个颠倒。注意 到了吗在函数调用语句中实参a 的结果是一个指针它的类型是 int *它指向的类型是int。形参这个指针的类型是char *它指向 的类型是char。这样在实参和形参的结合过程中我们必须进行一 次从int *类型到char *类型的转换。结合这个例子我们可以这样来 想象编译器进行转换的过程编译器先构造一个临时指针char *temp 然后执行temp(char *)a最后再把temp 的值传递给s。所以最后的 结果是s 的类型是char *,它指向的类型是char它指向的地址就是 a 的首地址。 我们已经知道指针的值就是指针指向的地址在32 位程序中 指针的值其实是一个32 位整数。那可不可以把一个整数当作指针的值 直接赋给指针呢就象下面的语句 unsigned int a; TYPE *ptr; //TYPE 是intchar 或结构类型等等类型。 a20345686; ptr20345686; //我们的目的是要使指针ptr 指向地址20345686 ptra; //我们的目的是要使指针ptr 指向地址20345686 编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能 达到了吗不还有办法 unsigned int a; TYPE *ptr; //TYPE 是intchar 或结构类型等等类型。 aN //N 必须代表一个合法的地址 ptr(TYPE*)a //呵呵这就可以了。 严格说来这里的(TYPE *)和指针类型转换中的(TYPE *)还不一样。这里 的(TYPE*)的意思是把无符号整数a 的值当作一个地址来看待。上面强 调了a 的值必须代表一个合法的地址否则的话在你使用ptr 的时候 就会出现非法操作错误。 想想能不能反过来把指针指向的地址即指针的值当作一个整数取 出来。完全可以。下面的例子演示了把一个指针的值当作一个整数取出 来然后再把这个整数当作一个地址赋给一个指针 例十七 int a123,b; int *ptra; char *str; b(int)ptr; //把指针ptr 的值当作一个整数取出来。 str(char*)b; //把这个整数的值当作一个地址赋给指针str。 现在我们已经知道了可以把指针的值当作一个整数取出来也可 以把一个整数值当作地址赋给一个指针。