一篇文章带你了解C语言的指针

本文介绍了内存的基本概念,包括内存单位的编号、地址与指针的关系,以及指针变量的大小。通过讲解32位和64位机器上指针的存储需求,帮助读者深入理解C语言中指针的本质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、指针

1.内存

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

内存划分的取余大致可以分为 栈区、堆区、静态区

  • 栈区中存放局部变量 包括函数的形式参数
  • 堆区用来动态内存分配 如malloc calloc realloc free等
  • 静态区存放静态变量或者全局变量

在这里插入图片描述
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的
内存变量的编号就是地址 地址又叫做指针
编号 == 地址 == 指针

1.个内存单元多大比较合适?
一个字节

2.内存单元的编号怎么产生

地址的产生:32位机器上 有32根地址线,通电是高电平或者低电平 转换成数字信号就是1/0
32根地址线能产生的电信号就有232
每一个二进制序列就可以作为一个内存单元的编号
所以就可以产生232个地址
一个内存单元是一个字节 一个内存单元给一个地址
那么就能管理232字节的空间
也就是4096MB=4GB的内存空间

int main()
{
int a=10;
向内存申请4个字节的空间 存储10
&a;a实际占用4个字节的空间 每个字节后有地址 但是&a拿到的是它第一个字节的地址(也就是小地址)
int *pa = &a;
pa叫做指针变量 
它是一个存放地址的变量 也可以认为是一个存放指针的变量
*说明pa是指针变量
int 说明pa指向的对象是int类型的

*pa=20;//通过解引用改变了a的值 *pa==a 对pa解引用就是a
&叫做取地址操作符
*叫做解引用操作符
return 0;

}

对于 int *pa=&a
可以用下图理解

在这里插入图片描述
pa存的是a的地址 而且是a的第一个字节的地址
在这里插入图片描述
p指针变量存放的地址指向num
而且是num第一个字节的地址(较小的地址)
对于p解引用就可以访问num

以指针类型为例子 就可以推广到其他类型

#include <stdio.h>
int main()
{
 char ch = 'w';
 char* pc = &ch;
 *pc = 'q';
 printf("%c\n", ch);
    return 0;
}

3.指针变量的大小是多大?

指针变量时用来存放地址的 指针变量的大小取决于地址的大小
32位机器上 地址是32个0/1组成的二进制序列 需要32bit位的空间存储 指针变量需要4个字节
64位机器上 地址是64个0/1组成的二进制序列 需要64bit位的空间存储 指针变量需要8个字节
不论是何种类型的指针变量 他们相同位数机器上的大小都是一样的

#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
    printf("%d\n", sizeof(char *));
    printf("%d\n", sizeof(short *));
    printf("%d\n", sizeof(int *));
    printf("%d\n", sizeof(double *));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值