C语言学习笔记---指针(1)

声明:文字版看不惯的请看每小节截图哦~

文章的末尾还有笔记的完整版长截图,可用电脑查看~

---------我是分割线-------

目录

//指针(CPU如何去内存中取数据呢?你如何去宿舍楼精准地找到同学的宿舍呢?需要房间号,指针

//地址要存起来怎么办?

//正经理解

//口头语中

//指针变量的大小


//指针(CPU如何去内存中取数据呢?你如何去宿舍楼精准地找到同学的宿舍呢?需要房间号,指针

//电脑:
//CPU:用来计算,叫做中央处理器
//内存:CPU计算的数据来源于内存,计算完后再放回内存里面去

//每一个内存单元大小取一个字节
//CPU和内存之间有三种总线连接,控制总线,地址总线和数据总线
//CPU通过控制总线发出R(read)的命令后进入内存,
//再通过比如32根地址总线读取数据的地址(比如32位的电脑就有32根数据总线)
//当CPU读取了数据的地址后,把读取到的地址里面的数据通过数据总线通报回CPU内部进行数据计算
//CPU并没有动内存中存储的数据,只是通过地址去读取每个内存单元中的数据

//当CPU计算完后,会通过控制总线发送W(write)效果给内存条
//内存接收到W命令后,地址总线就给计算结果分配内存单元
//分配好内存后计算结果就通过数据总线进入内存中存储

//地址总线通过电信号就能够产生一组二进制序列,就可以作为内存单元的编号,但不是真的编号,这个编号不会储存起来,只是使用者和机器的创造者都心知肚明的
//编号==地址==指针

//int main()
//{
//    int a = 10;//表层意思是创建一个变量a,并赋值为10
//               //深层意思是在内存上申请4个字节的空间,存放10
//    &a;//把a的地址取出来
//    //打印a的地址
//    printf("%p\n", &a);//%p是打印地址占位符,地址是16进制的形式输出
//    //1&2按位与(两个操作数),&a取地址
//    return 0;
//}
//一个16进制位是4个二进制位

//int main()
//{
//    int a = 0x11223344;//11 22 33 44 各占一个字节,总共4个字节,也就是类型int所占的字节
//    printf("%p\n", &a);//两个16进制位是8个二进制位等于1个字节,
//    return 0;
//}
//前面说了内存中每一个字节都有一个地址,但是只打印(较低的那个地址)首字节的地址,比如你家里有好几栋房子,但是快递只写一个地址就行
//只要知道首字节的地址就能够顺藤摸瓜找到后面的地址
//内存开辟是从数据的高位到低位,但是内存中的编号是从上到下递增编号

--------------------我是分割线-------------------

//地址要存起来怎么办?

//int main()
//{
//    int a = 10;//a是存放了整型的变量,pa是存放了指针的变量,int之于a相当于int*之于pa
//    int * pa = &a;//存到pa里面去,但是作为存地址的pa的类型怎么写?加上int *,此时pa就变成了指针变量
//    //指针变量pa--存放了地址的变量--地址又被称为指针,指针变量是用来存放指针的
//    //以下三种写法都是正确的:
//    //int *pa;
//    //int* pa;//建议用这种写法,直接把int*当成一个存放了地址的变量的类型
//    //int * pa;
//    
//    return 0;
//}

//正经理解


//指针和指针变量
//地址     变量-存放地址

//口头语中


//说的指针一般是指针变量
//说的地址--地址
//把指针变量说成是指针,把指针说成是地址:比如说“pa是个指针”,但是其实pa是指针变量

//int main()
//{
//    int a = 10;
//    int* pa = &a;//取地址&a-->地址,想要把这个地址存起来的时候,就创建了变量pa
//    //*号是在说明pa是指针变量,也就是存了地址的变量,和普通的变量不一样      
//    //前面的int表示:pa指向的对象a的类型是int类型的数据,也就是里面存放的地址是来源于int类型的数据的地址
//    //把a的地址交给了pa,pa就相当于一个代理人,让pa去操作,通过这个代理人去改a
//    char ch = 'w';
//    char* pc = &ch;
//
//    *pa;//*是解引用操作符,可以自己理解为是解除它的封印,去找到它的元神
//    //意思就是通过pa里面的地址找到它所指向的值a
//    //*pa==a
//    *pa = 20;//表示a被改成了20
//    printf("%d\n", a);
//    
//    return 0;
//}

//指针变量的大小


//指针变量是专门用来存放地址的,无论什么东西放进去都被当成是地址了
//指针变量的大小取决于地址的存放需要多大的空间
//32位机器上:地址线是32根,地址的二进制序列就是32bit位,要把这个地址存起来,需要4个字节的空间,也就是32bit位的空间
//所以,32位机器上指针变量的大小都是4个字节,不管什么类型的指针都是4个字节
//同理64位机器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要
//8个字节的空间,指针变量的⼤⼩就是8个字节
int main()
{
    char* pc =NULL;//空指针,也可以写0
    int* pi = NULL;
    printf("%zd\n", sizeof(pc));//%zd是打印类型大小的占位符
    printf("%zd\n", sizeof(pc));
    return 0;
}

---------我是分割线-------

笔记完整版:(手机看比较模糊,可用电脑查看)

预知后事如何,请听下回分解......

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vera工程师养成记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值