c指针原理及其使用详解

本文深入探讨C语言中的指针,包括内存数据存储、指针寻址、数组特性、指针类型、指针运算、复杂指针声明、函数与数组指针的交互以及左右值的概念。通过实例解析指针如何存储地址、如何通过指针获取变量值,以及数组和指针的区别,帮助读者理解指针这一C语言的重点和难点。

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

  
众所周知 c语言学习过程当中 指针一直是个重点和难点 ,此帖谈一下我看完《c与指针》等书之后的见解;
希望能帮到大家,内容有不对的欢迎大家指正


      

目录

  一: 内存中数据是如何存储的

 二:指针是如何寻址的

 三:数组    

数组的特性:

数组与指针的区别:

    四:类型

结论:

附: 两个指针类型是否相融(是否可以进行赋值

五  指针的运算

六(复杂 指针/声明

七(函数/数组/指针

八(左右值)

总结: 


                                                               

  一: 内存中数据是如何存储的

要想彻底理解指针及其概念 ,就得弄清楚数据如何存储的 ,这里涉及到底层的一些知识
推荐一下王爽版本的汇编 :
  1. https://www.bilibili.com/video/BV1Rs411c7HG?from=search&seid=5397185164506602840
 

1
  cpu只认识二进制  不管是数据,还是要执行的代码(也是数据),在内存中就是一连串的二进制数字
  CPU和内存之间需要读取或存储数组,之间就需要一个沟通的桥梁,这个桥梁就叫做地址总线(总线有三种:地址/数据/控制)。


那为什么叫地址总线而不叫数据总线?这是因为CPU在读取内存中的数据时的第一步是先找到数据的地址,有了地址才能把数据的具体位置找到,然后通过数据总线传输。



就像在商店里买东西,先得找到物品,才能付钱买





2
    内存中最小的储存单元是一个字节,可以把这一个个字节看成一个个房间,在这个房间中能储存数据,这些房子会整整齐齐地排成一排。 


这个时候就有问题了,CPU应该怎么确定数据是储存在哪个房间呢?这个时候就要靠地址了,可以把这个地址看成房间的号码,显而易见的是每一个房间的号码是必须要是不同的

如8086能寻 1MB的 范围地址(段地址加偏移量,类似下标法寻址法)如debug程序中:
 



   
如上图最左边 073F:01bd  就是地址(073f是段地址 冒号右边就是偏移地址) ,右边就是地址中所储存的数据(以16进制显示,两个为一字节)


  而我们的数据就是存储在这些地址中,对这些地址中的数据进行操作以达到程序的目的  
  但跟c语言和指针有什么关系呢?

                                                                  

 二:指针是如何寻址的

1

  我们都知道源代码是经过编译器和连接器 才能成为可执行文件方能运行

前面说了cpu是通过地址来寻找所需内容的,当然不认识变量名 ,这里就要提一下符号表:
  1. https://blog.csdn.net/qq_30120725/article/details/47064035
复制代码

一个变量名其实就相当于一个符号,代表一个具体的地址位置
注意:代表一个位置(地址),地址里存放的数据(内容)与地址本身不同

编译时自动转换为内存中相应的具体地址。

举个列子 我们先写一个源程序


 

生成汇编程序:


 

可以看到并没有出现a这个变量名。

而是在栈段中操作,有同学就要问了,这也看不到地址呀?

众所周知 自动变量就是储存在栈中,栈当然也是内存中的地址啦,栈中数据通过ss sp两寄存器来对数据进行操作 ,相当于数组通过下标来寻址

这个例子中a就在栈顶以下8个内存单元 ,把666这个值“赋值”给对应位置(地址

  1. movl        $666, -8(%rbp)                //地址为栈顶以下八个内存单元
复制代码

2                   当我们定义一个变量  

  1. int b = 666;
复制代码

我们只知道 b的值为666 怎么知道b变量的地址呢 ?
------- 在c语言中 我们可以用 &操作服来获取变量本身的地址


        重点来了,当我们定义一个指针变量并初始化

  1. int *p = &b;
复制代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值