指针类型与指针指向类型理解

来源:互联网 发布:种子填充算法原理 编辑:程序博客网 时间:2024/05/02 09:18

今天在看一些C语言面试题时,遇到这样一个题目:

#include<studio.h>int main(){    unsigned int a = 0xFFFFFFF7;    unsigned char i = (unsigned char)a;    char *b = (char *)&a;    printf("%08x,%08x",i,*b);}

我先说一下答案,0x000000F7 ,0xFFFFFFF7

关于指针,我经常听到或看到这两种说法,“指针类型与指针指向类型”,那这两种说法到底有什么关系呢?

首先,我们随便定义一个指针:

int *a;

那么,这里的int是什么含义呢?
我的解释:假设我们在32位的机器上,首先要知道的一点,不管怎样,无论是int *a,还是char *a;这里的a的值都是4字节,32位的。我认为指针类型与指针指向类型就是一个意思,这里都是表示: a这个变量的值,是一个int型变量的地址,因此,我们在给a赋值的时候只能将一个int型变量的地址值,赋值给它,即:

int b = 10;int *a;a=&b;

如果这样写:

char b = 'b';int *a;a=&b;

编译肯定会报错的。
此时如果,一定要这样写,就需要强制类型转换。

char b = 'b';int *a;(char *)a=&b;

那么转换之后,跟上面那道题目就几乎一样了,那么现在跟原来有什么区别呢?
其实转换之后,a本身的值还是4个字节的,但是此时他存储的是一个char型的变量的地址,所以可以说它指向一个char类型,或者此时指针类型是char。就是因为他还是4个字节,a本身没有变化,所以*a的值还是不变的。改成这样后的唯一变化就是:
a+1

之前a+1:  是地址的值+4,因为它指向的是int型现在a+1:  是地址的值+1,因为它指向的是char

好了,现在看上面的题目应该知道怎么做了。

0 0
原创粉丝点击