C语言笔记之指针(二)

前言

本文主要介绍指针与内存和地址的关系,指针与内存关系深入解析,包括占用大小、动态分配,提醒使用sizeof()注意点。仅供大家参考学习,若有错换之处,欢迎交流指导~


C语言笔记之指针(二)_第1张图片

指针在不同位数电脑中的内存占用

在上图左边可以看出,不同位数的电脑中,指针本身所占的内存空间大小也不同.

  • 32位的电脑中,单个变量共有2^32种位置供存储数据,而指针为了能够找到该变量,则值的取值范围为0~2^32,也就是需要4个字节的内存空间大小.
  • 64位的电脑中,单个变量共有2^64种位置供存储数据,而指针为了能够找到该变量,则值的取值范围为0~2^64,也就是需要8个字节的内存空间大小.

内存分配与指针关系

假如我们使用malloc()函数申请内存空间

int *a=malloc(sizeof(int)*6);

那么指针所存储的地址为申请的内存空间的首个地址,也就是a&a[0]相等,正如图中右边所示.因为a是指针所指向的地址,而&a[0]是指向地址的首地址,故两者相等.

内存大小计算注意事项

假如我们使用sizeof()去计算内存空间大小

int size=sizeof(a);

实际计算的是指针a的所占内存空间大小,而不是a[0]a[5]的内存空间大小.正如下面的代码中的指针,无论你用malloc()分配多大的内存,两者用sizeof()计算的大小都是一致的.

int *a=malloc(sizeof(int)*1);
int *b=malloc(sizeof(int)*2);

因为当你使用free()释放内存空间时,指针本身的内存空间还是会存在的,所以在释放后用sizeof()去测量内存时,其值仍问指针本身的内存空间,也就是图中的左边部分.


相关代码

#include 
#include 

int main(void)
{
    /** number0,number2进行赋值操作,number1,number3不赋值 **/
    int number0[3];
    int number1[3];
    int *number2 = malloc(sizeof(int) * 3);
    int *number3 = malloc(sizeof(int) * 3);

    /** 未赋值前指针所占空间大小 **/
    printf("number2内存空间为%d,\nnumber3内存空间为%d\n\n", sizeof(number2), sizeof(number3));

    /** 赋值操作 **/
    for (int i = 0; i < 3; i++)
    {
        number0[i] = i;
        number2[i] = i;
    }

    printf("number0所占内存大小为%d,\nnumber1所占内存大小为%d,\nnumber2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number0), sizeof(number1), sizeof(number2), sizeof(number3));
    /**  内存空间大小不随存储数据值的大小而变化 **/
    for (int i = 0; i < 3; i++)
    {
        number0[i] = 1 << 31 - 1;
        number2[i] = 1 << 31 - 1;
    }
    printf("number0所占内存大小为%d,\nnumber2所占内存大小为%d\n\n", sizeof(number0), sizeof(number2));
    /** 检测number2数组元素是否溢出 **/
    for (int i = 0; i < 3; i++)
    {
        printf("number2[%d]=%d\n", i, number2[i]);
    }
    free(number2);
    free(number3);
    number2 = NULL;
    number3 = NULL;
    /** 检测是否释放完指针
     *  问题:运行后发现并没有释放完指针
     *  分析:这是因为free()函数取消给该指针存储的内存空间,但是指针本身的内存空间并没有取消,
     *  所以sizeof()函数依然可以检测到指针的内存空间大小
     */
    printf("\nnumber2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number2), sizeof(number3));

    /** 改变动态分配的内存
     * 结论:动态分配不改变指针本身的内存空间大小,但是可以改变指针指向的内存空间大小
     * sizeof()函数检测的是指针本身的内存空间大小,
     * 无论是改变指针指向的地址还是改变指针指向的内存空间大小,
     * 都不会改变指针本身的内存空间大小
     **/
    number2 = malloc(sizeof(int));
    number3 = malloc(sizeof(int) * 2);

    printf("number2所占内存大小为%d,\nnumber3所占内存大小为%d\n\n", sizeof(number2), sizeof(number3));
    return 0;
}

你可能感兴趣的:(c语言,笔记,算法,数据结构)