C语言-初探指针

初探指针

  • 指针概念
  • 指针和指针类型
    • 指针类型意义
  • 野指针
    • 如何避免
  • 指针运算
    • 指针+-整数
    • 指针-指针
    • 指针的关系运算
  • 指针和数组
  • 二级指针
  • 指针数组

指针概念

  1. 指针是内存中一个最小单元(1个字节)的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量

int a = 10; //在内存中开辟空间,a是整型变量,占用4个字节的内存空间
int* p = &a; //使用&操作符,取出a的第一个内存单元地址,存放在指针变量pa中,pa的类型是int*

在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以
一个指针变量的大小就应该是4个字节
那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址
总结:
指针变量是用来存放地址的,地址是唯一标示一块地址空间的
指针的大小在32位平台是4个字节,在64位平台是8个字节

指针和指针类型

指针的类型:char*、short*、int*、long*、……

指针类型意义

指针类型的意义1:
指针类型决定了指针在被解引用的时候访问几个字节
如果是int*的指针,解引用访问4个字节,如果是char*的指针,解引用访问1个字节

在这里插入图片描述

在这里插入图片描述

指针类型的意义2:
指针类型决定了指针±操作的时候,跳过几个字节,决定了指针的步长

在这里插入图片描述
010FFE20 - 010FFE1C = 0x04
0减C,向高位借1,因为是16进制,所以就是16+0=16,16-12©=0x04,就是10进制的4

野指针

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

如何避免

  1. 指针初始化
  2. 小心指针越界
  3. 指针指向空间释放即使置NULL
  4. 避免返回局部变量的地址
  5. 指针使用之前检查有效性

指针运算

指针±整数

#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}

*vp++*vp然后vp++虽然后置++的优先级高,但是后置++是先使用,后++
(vp)++是vp指向的内容++

指针-指针

指针-指针得到的是指针和指针之间的元素的个数
不是所有的指针都能相减,指向同一块空间的2个指针才能相减

指针的关系运算

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
*vp = 0;
}

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证
它可行。
但是标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。

指针和数组

数组名代表首元素的地址,除了
1.sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组
2.&数组名,取出的是数组的地址,&数组名,数组名表示整个数组
在这里插入图片描述

二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在二级指针中
在这里插入图片描述
对ppa解引用*ppa得到的是pa的值,再解引用**ppa得到的是a的值

指针数组

是数组,是存放指针的数组,存放的类型是int*

#include <stdio.h>int main()
{int a = 1;int b = 2;int c = 3;int* pa = &a;int* pb = &b;int* pc = &c;int* parr[10] = { &a, &b, &c };int i = 0;for (i = 0; i < 3; i++){printf("%d ", *(parr[i]));//1 2 3}return 0;
}

模拟出二维数组

#include <stdio.h>int main()
{int arr1[4] = { 1, 1, 1, 1 };int arr2[4] = { 2, 2, 2, 2 };int arr3[4] = { 3, 3, 3, 3 };int* parr[4] = { arr1, arr2, arr3 };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 4; j++){//printf("%d ", *(parr[i] + j));printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

*(parr[i] + j) 和 parr[i][j]是等价的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(免费领源码)java#springboot#mysql校园医院预约挂号系统32236-计算机毕业设计项目选题推荐

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对校园医院管理等问题&#xff0c;对校园医院…

初识单片机

单片机 英文 Micro Controller Unit&#xff08;MCU&#xff09; 1.内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 2.单片机的任务是信息采集&#xff08;依靠传感器&#xff09;、处理&#xff08;依靠CPU&#xff09;和硬件设备&#…

【嵌入式单片机】之RS-232、RS-485、RS-422比较

1. RS422是什么 RS422,正式名称为TIA/EIA-422,是一种串行通信标准,专为实现长距离、高可靠性的数据传输而设计。它采用差分信号传输技术,通过两对双绞线实现全双工通信,即发送和接收可以同时进行。RS422在工业自动化和远程监控系统中曾经扮演着重要角色,以其出色的抗干扰…

MySQL—常用的数据类型

数据类型 整型 1.创建一个含有无符号/有符号整型的字段的表 CREATE TABLE L1(id tinyint unsigned #无符号 ) CREATE TABLE L2(id tinyint #默认为有符号 ) 数值型(bit) 2.数值型(bit)的使用 小数 3.数值型(小数)的基本使用 字符串 4.字符串的基本使用 #演示字符串类型…

【学习笔记】网络设备(华为交换机)基础知识1——命令行入门知识

一、前期准备 提示&#xff1a;下面所有学习内容都是基于以下条件完成的 条件1.已经可以正常访问交换机的命令行接口 连接到命令行接口的方法 &#xff1a; ① &#xff1a;通过Console口本地访问 ② &#xff1a; 通过Telnet访问 ③ &#xff1a; 通过SSH访问 ④ &#xff1…

小阿轩yx-LVS负载均衡群集

小阿轩yx-LVS负载均衡群集 构建群集服务器—通过整合多台服务器使用 LVS 达到服务器的高可用和负载均衡并以同一个 IP 地址对外提供相同的服务 LVS 群集应用基础 群集称呼来自英文单词“Cluster”在服务器领域则表示大量服务器的集合体&#xff0c;区分单个服务器 Cluster …

创新驱动,智享未来:电动车仪表盘之蓝牙芯方案

电动车行业不断发展的浪潮中&#xff0c;我们自豪地推出引领时代的电动车仪表盘蓝牙芯方案&#xff0c;为您的骑行之旅带来前所未有的智能与便捷。 精准掌控&#xff0c;一目了然 我们的蓝牙芯方案搭载了高性能BLE 5.0蓝牙芯片-HS6621CG-C 内核ARM Cortex-M4F, max 64MHZ,SRAM…

Operations Research课程之带约束的非线性规划(凸分析|Lagrange松弛|Lagrange对偶|KKT条件)

目录 1.凸分析 1.1 为什么需要凸分析 1.2 凸分析相关概念 1.3 凸规划定义 1.4 单变量NLP凸分析 1.5 多变量NLP凸分析 2.拉格朗日松弛 2.1 拉格朗日函数 2.2 拉格朗日对偶 2.2.1 弱对偶性 2.2.2 凸性 2.2.3 强对偶性 2.2.4 与LP对偶关系 3.KKT条件 3.1 KKT介绍…

Redis 管道(Pipeline)是什么?有什么用?

目录 1. redis 客户端-服务端模型的不足之处 2. redis 管道是什么&#xff1f;有什么好处&#xff1f; 3. 管道的使用场景 4. 管道使用的注意事项 1. redis 客户端-服务端模型的不足之处 众所周知&#xff0c;redis 是一个客户端-服务端的模型设计&#xff0c;客户端向服务…

上海网站建设如何做

上海是中国最繁华的城市之一&#xff0c;作为全国的经济、文化和科技中心&#xff0c;网站建设在上海变得越来越重要。如何做好上海网站建设&#xff0c;让网站更加吸引人&#xff0c;成为企业和个人宣传自身的重要平台呢&#xff1f; 首先&#xff0c;要有清晰的定位和目标。在…

SCI一区级 | Matlab实现BO-Transformer-BiLSTM时间序列预测

SCI一区级 | Matlab实现BO-Transformer-BiLSTM时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-BiLSTM时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现BO-Transformer-BiLSTM时间序列预测&#xff0c;贝叶斯优化Transfor…

Zoom视颊会议软件使用

GPT-3.5 (OpenAI) Zoom是一款极受欢迎的视频会议软件。使用Zoom可以方便地进行视频会议、远程授课、在线研讨会等活动。以下是Zoom的使用步骤&#xff1a; 1. 下载Zoom客户端 可以在Zoom官网上下载对应平台的Zoom客户端。下载并完成安装后&#xff0c;双击打开客户端。 2. 创建…

【AI】ChatTTS实现文本转语音

最近有时间继续研究一下各种有趣的开源项目&#xff0c;一个叫ChatTTS的项目吸引了我的注意&#xff0c;这个项目可以把文本转换成语音&#xff0c;配合gpt生成文本&#xff0c;可以直接用于生产有声书作品了&#xff0c;这可以说是直接的生产力项目了。 项目对显存的要求不高&…

Git 操作补充:cherry-pick、变基

1. 挑选提交合并 git cherry-pick 对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是一种常见的需求&#xff0c;这可以分成两种情况&#xff1a;一种情况是&#xff0c;你需要另一个分支的所有代码变动&#xff0c;那么就采用 git merge&#xff1b;另一种情…

SF-HCI-SAP问题收集17:值映射布尔型EC数据

Complacency is the enemy of study 学习的敌人是自己的满足。 SAP SuccessFactors Employee Central 到 SAP ERP 的员工主数据复制 successfactor employee center主数据同步&#xff0c;一直以来排错比较难&#xff0c;难的地方是这个提示消息比较隐晦&#xff0c;而且同步的…

云原生技术架构详解

云原生技术最全详解(图文全面总结) 容器技术 容器技术&#xff1a;是将应用程序、及其所有依赖项&#xff0c;打包到一个独立的、可移植的容器中。 如下图所示: 容器技术的实现&#xff0c;最典型的就是以Docker为代表的。 如下图所示&#xff1a; 主要解决&#xff1a; 1、…

Ubuntu设置nacos开机以单机模式自启动

首先&#xff0c;需要安装jdk Ubuntu 安装JDK 创建Systemd服务单元文件 sudo vim /etc/systemd/system/nacos.service按i进入编辑模式&#xff0c;写入下面信息 [Unit] Descriptionnacos server Afternetwork.target[Service] Typeforking Environment"JAVA_HOME/opt/j…

Kafka集群安装部署

简介 Kafka是一款分布式的、去中心化的、高吞吐低延迟、订阅模式的消息队列系统。 同RabbitMQ一样&#xff0c;Kafka也是消息队列。不过RabbitMQ多用于后端系统&#xff0c;因其更加专注于消息的延迟和容错。 Kafka多用于大数据体系&#xff0c;因其更加专注于数据的吞吐能力…

用freertos后NVIC里系统时钟部分报错,如何解决?

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

YOLOv8模型调参---数据增强

目录 1.数据预处理 2.数据增强 2.1 数据增强的作用 2.2 数据增强方式与适用场景 2.2.1离线增强&#xff08;Offline Augmentation&#xff09; 2.2.2 在线增强&#xff08;Online Augmentation&#xff09; 3. 数据增强的具体方法 4. YOLOv8的数据增强 4.1 YOLOv8默认…