初学C语言时,对指针基本含义的理解

1. 指针是什么

  首先需要明白,指针也是一个变量,但是指针的大小是固定的,这是由操作系统决定的,32位的操作系统的指针的大小就是32位(4个字节),64位的系统就是64位(8个字节)。

  这里我们先定义两个不同类型的指针(ptr和ppp),并指向一个相同的变量。

		int *ptr;
		char *ppp;
		int a = 0x12345678;
		ptr = &a;
		ppp = (char *)&a;

  假如这两个指针放到32位的机器上,那么sizeof(ptr)和sizeof(ppp)的值均为4。假如放到64位的机器上,那么sizeof(ptr)和sizeof(ppp)的值就变成8了。

  其次呢,指针是用来指向一段内存空间的首地址的,我自己的理解的指针就是一个标签。比如说我约了客户来公司谈生意,那我要告诉他我们公司在哪里,我得告诉他,公司在xx区xx街道xx号xx楼(这个就等同于数据的地址)这样才能确保他不会走错地方,但是这样太麻烦了,所以我们制作了个人名片(就相当于指针),上面就有公司的详细地址,我只要在需要的时候给别人我们公司的名片就好了,别人就可以通过名片上的地址精确地找到公司在哪里。

  这里我们用上面代码作为例子简单画了一个示意图如下(地址是假想的),那么可以清楚ptr和ppp的值都是0x12340000。

2. 指针的类型

  我们知道在定义指针的时候都需要给指针赋予相应的类型,当用到指针的时候编译器就会知道要到那个上去寻找相应数据,同时编译器也是通过指针的类型来知道应该拿多大或者说拿多少个字节的数据。(因为我们知道数据在读取的时候都是以字节为单位的。)

  可以看到我们在定义变量a的时候说明了a是int类型的,但是ppp是“char *”类型的,因此我们要是想用ppp指向a的时候就会出现赋值语句两边类型不匹配,编译器就会给你报错。但是无妨,我们可以用强制类型转换,将赋值语句两端的量变为同样的“char *”类型。

  此时如果我们用如下的代码编译运行:

int main (void)
{
    
    
        int     *ptr;
        char    *ppp;
        int     a = 0x12345678;

        ptr = &a;
        ppp = (char *)&a;

        int     x = *ptr;
        int     y = *ppp;


        printf("*ptr = %#x\n*ppp = %#x\n",x, y);    //printf的%x格式化输出是十六进制输出,加上“#”输出前缀
        return 0;
}

  产生的输出如下:

产生的输出
  大写的W、T、F?为什么a明明是0x12345678,两个同样指向a的指针取出来的值缺不一样呢?因为,用char类型定义的指针在取值的时候只拿char类型的大小(1个字节),int类型定义的指针就拿了int类型的大小(4个字节)

&esmp;&esmp;以上就是对于指针的最基本的理解,明白这两个点对于指针的理解来说非常重要,当然实践才能出真知,要想更好的了解指针,还是得自己去实际的实验尝试。

猜你喜欢

转载自blog.csdn.net/weixin_46528376/article/details/112606449
今日推荐