【C语言】指针基础知识(一)

本文详细解释了CPU如何通过内存读取和处理数据,介绍了内存地址的概念,包括内存单元、编址方式以及控制、地址和数据总线的作用。此外,还探讨了指针变量、地址获取、解引用操作符的使用,以及不同平台下指针变量大小的差异。
摘要由CSDN通过智能技术生成

af3be47e1d3f4ecb9d2eddbe236b0e45.png

计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。

一,内存和地址

内存被分为一个个单元,一个内存单元的大小是一个字节。

内存单元的编号(可以理解为门牌号) == 地址 == 指针
 
编址:如何找内存空间(找门牌号)
 

56ed76c333844401a7371cc18765d943.png

控制总线:发信息———要读取目标信息

地址总线:拿信息———拿取到目标信息

数据总线:传信息———从内存向CPU传信息

二,指针变量和地址

1,简单理解:

int main()
{
    int a = 0;

    return 0;
}

表层意思:创建一个变量a,并赋值为10。

深层意思:在内存上申请4个内存的空间,存放10。

2,取地址:

int main()
{
    int a = 10;
    printf("%p", &a);

    return 0;
}

运行结果:

d0104b6abd5d4abcb0346306f04667a6.png

一个整型的大小为四个字节,每个字节都有它所对应的地址。但是打印整型地址时并不是四个字节都打印,而是只打印四个地址里的第一个地址(地址较小的那个)。

3,指针变量:

地址可以用指针变量存放起来。也就是说,指针可以用指针变量存放起来。
int *pa=&a;
pa为指针变量,int*为变量的类型。
注意!!!我们口头所说的指针一般是指针变量。
通过地址可以找到a,也可以说是pa指向了a的起始位置。
2321b7afe3d948d895325f5b92b3a277.png
int*中的int和*分别代表什么?
 
*      说明pa是指针变量的意思
int    说明pa指向的对象的类型是int类型

4,解引用操作符

地址有了,该怎么用?也就是说,有了变量(pa),该怎么用?

这样用:

int main()
{
    int a = 10;
    printf("%p\n", &a);
    int* pa = &a;
    *pa = 20;

    return 0;
}

*pa为解引用操作符,意思是:通过pa里面的地址找到它所指向的值,也就是a。也就是说,*pa就是a。

代码中*pa=20的意思就是a=20。

5,指针变量的大小

指针变量是专门来存放地址的,无论是什么,只要在指针变量里,它都是地址。

指针变量的大小有多大?取决于一个地址的存放需要多大的空间。

验证:

#include<stdio.h>
int main()
{
    char* a = NULL;
    int*  b = NULL;
    printf("%zd\n", sizeof(a));
    printf("%zd\n", sizeof(b));
    return 0;
}

运行结果:

29a2e3e52f59450bb81406d2632bf5b0.png

注:X86是32位机器,X64是64位机器

 

32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
注:不同环境会带来不同的影响,例如:指针变量大小的区别
 
 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅行的九月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值