C语言中的指针和指针变量

发布于:2022-12-22 ⋅ 阅读:(135) ⋅ 点赞:(0)

一.内存

        内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。
        所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
解释一下地址是怎么产生的:

我们在安装操作系统的时候,经常会被问到电脑是32位还是64位这个问题,接下来,我就给大家介绍一下32位这到底是什么,如上图你可以大致理解32位指有32根地址线/数据线,电流有正负之分,正电为1,负电为0,这样就有2^32中排列组合也就是有2^32个地址,32位是指电脑CPU一次处理的最大的数据量,也就是它一次可以处理4Byte(32bit,一个bit就是存储0/1,也就是存储二进制,1byte=8bit,32除以8就有4byte),64位一次可以提取64位数据,也就是8个字节的量,比32位提高了1倍64位一次可以提取64位数据,也就是8个字节的量,比32位提高了1倍

 二.指针及指针变量

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a=10;
    &a;//'&'是取地址符
    int* b=&a;//有一种变量是用来存放地址的被称为“指针变量”
    //所以上句的意思是将a的地址存放到变量b中
    printf("a的地址是:%p\n",a);
    printf("&a的地址是:%p\n",&a);
    printf("b的地址是:%p\n",b);
}

%p是用来打印地址的输出符号,我们运行看看结果:

我们看到&a和b的地址是同一个,再用图解释一下:

int* p 我们需要从多个角度来看:
1.把int*看成一个整体,那么就是将p作为一个指针变量,存放a的地址,而前面的int只是申明所存放的a是一个整数类型,如果a是double类型,那么我们就需要写成double* p=&a;
2.如果只有*p,那么*p就是a,'*'是解引用操作符。

        我们来分析一下上图:首先定义a=10;即开辟一个空间存放10,地址为0*0012ff40;然后指针变量p存放a的地址,即开辟一个空间存放0*0012ff40;之后*p=20,而*p其实指的就是a,所以就是将a重新赋值为20。我们验证一下:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    double a=10.12;
    double* b=&a;
    *b=12.23;
    printf("*b=%lf\n",*b);
    printf("a=%lf\n",a);
}

 我们再看看输出结果:

当我们给*b赋新的值时,a的值也是随着变化同一值,也就表明*b就代表了a。 

三.指针变量的大小

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("%d\n",sizeof(int*));
    printf("%d\n",sizeof(short*));
    printf("%d\n",sizeof(double*));
    printf("%d\n",sizeof(char*));
    printf("%d\n",sizeof(long long*));
    return 0;
}

 输出的结果是:

我们发现最后结果都是8,跟所用的类型无关。
结论:指针变量大小在32位平台是4个字节,64位平台是8个字节,其大小跟类型无关。32位平台就说明有32bit再除以8就是4个字节,64位同理。

本文含有隐藏内容,请 开通VIP 后查看