当前位置: 首页 > article >正文

C语言从入门到精通第16天(指针的定义与基本使用)

指针的定义与基本使用

  • 什么是指针?
  • 指针变量的定义
  • 指针变量的基本使用

什么是指针?

在使用指针之前我们需要对指针进行初步的了解,首先我们要知道什么是指针?

通过前面的学习我们已经知道了内存的存储方式,他是通过一个字节一个字节的连续存储单位进行内存的存储,每一个字节我们称为一个内存单元。为了能够正确的访问这些内存单元,就必须为每个内存单元编上一个号,根据一个内存单元的编号即可准确的找到该内存单元,以及提取该内存单元存储的数据。

这里的内存单元的编号就叫做地址,而这个地址就是我们所说的指针。

指针变量的定义

如果在程序中定义了一个变量,在对程序进行编译或运行时,系统会给这个变量分配内存单元,并确定他的内存编号,即变量的地址,也称变量的指针。而存放这个变量地址的变量被称为指针变量

语法:

数据类型 *指针变量名

  • 数据类型支持C语言的所有数据类型
  • 指针变量名遵循C语言变量的命名规则

例如:int *p;定义一个指针变量,p为变量,int * 是类型。在这里我们也认为指针是一种数据类型。

指针变量的基本使用

1)指针变量赋值

语法:
指针变量 = &变量名;

  • 其中&为取地址运算符
  • 如果这里直接定义指针变量,而不进行初始化(即赋值),则指针为野指针。
  • 定义指针时,可以将指针初始化为空指针,即将NULL(是一个值为0的宏常量)赋值给指针变量。

注:
1)野指针的危害:因为直接对指针进行定义而不进行初始化,则指针变量的指向空间就不确定,所以指针可能会操作到非法的内存空间,导致程序崩溃。
2)空指针的作用是防止指针变量变成野指针。

这里是将变量的地址赋值个指针变量,因为指针也表示的是一个地址。即指针变量的值可以代表这个指针指向以这个值为首地址的那块内存空间。如下图:

在这里插入图片描述

在定义指针变量并对这个指针进行初始化(即赋值)时,系统会自动地分配内存给指针,并且要将这个变量的地址赋值给这个指针,所以这个指针的内容就是变量的地址。

代码如下:

int main(){
    // 定义一个野指针
    int *p;
    printf("%p",p);  // 输出值为0000000000000000

    // 定义一个空指针,防止指针变成野指针
    int *f = NULL;

    // 定义一个变量
    int a = 3;
    // 定义一个指针
    int *t;
    t = &a;
    printf("a id: %p\n",&a);  // 输出为0000007f555ff61c
    printf("t id: %p\n",t);  // 输出为0000007f555ff61c

    // 还可以这样进行初始化
    int *l = &a;
    printf("l id: %p",l);  // 输出为0000007f555ff61c

}

2)指针变量操作指向的内存空间

语法:

*指针变量

通过指针运算符(也称”间接访问“运算)*对指针所指向的变量的地址的内容进行访问。并且可以通过指针变量访问和修改所指向的内存空间中的内容。代码如下:

int main() {
    // 定义一个变量
    int a = 3;

    // 定义一个指针
    int *t = &a;

    // 可以通过 * 对变量的内容进行访问
    printf("%d\n",*t);  // 输出为3

    // 改变指向内容的值
    *t = 10;
    printf("%d %d",*t,a); // 输出为10 10
}

http://www.kler.cn/news/16271.html

相关文章:

  • PID控制---基于python模拟
  • 面向画布(Canvas)的JavaScript库
  • 【c语言小项目】基于easyX的俄罗斯方块
  • Analysis For Office的一些使用技巧
  • C++练级之初级:第六篇
  • 使用PyTorch和Flower 进行联邦学习
  • 重载new和delete
  • Flutter集成个推推送-安卓原生篇
  • 【电商必学】 WhatsApp 全新攻略:什么是交互式消息模板
  • 【Zookeeper源码走读】第一章 客户端与服务器的连接过程
  • 麓言信息设计创意思维,打开设计师思路
  • 智慧物流信息系统开发需具备哪些功能?
  • 2023北京老博会(中国国际老年产业博览会)展位预订迎高峰
  • 鸿蒙系统是什么?鸿蒙与开源鸿蒙的关系?鸿蒙系统的发展历程
  • H2O生成——屏障
  • 论文笔记:Model-Contrastive Federated Learning
  • TPM-TPM-Profile-PTP协议-2
  • Vue3事件绑定
  • 【五一创作】50道Java面试题
  • Python的一些知识
  • 做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !
  • 更轻更好用的蓝牙耳机,日常佩戴更舒适,QCY Crossky Link体验
  • Nginx:常见的面试题和答案
  • Delphi 内存分配
  • Java程序猿搬砖笔记(十二)
  • 记录和传播知识的重要性不亚于创造知识本身【专利所保护的,主要是`流程`、`工艺`和`方法`,不是一个具体的产品。】
  • 与贵州公安面对面|欧科云链天眼中国行,他们都说“行”
  • 点亮第一个LED灯
  • vue3+element-plus角色权限管理分配
  • 使用cube studio开发机器学习建模的pipeline