C语言指针+-整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组

文章目录

  • 前言
  • 一、指针 +- 整数
  • 二、指针 - 指针
  • 三、指针的关系运算
  • 四、指针和数组
  • 五、二级指针
  • 六、指针数组
    • 指针数组可以将几个一维数组模拟成二维数组
  • 总结


前言

C语言指针±整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍,还包括指针数组将几个一维数组模拟为二维数组等的介绍。


一、指针 ± 整数

// 指针加1遍历数组
#include <stdio.h>
int main()
{int arr[10] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;int* p = arr;for (i = 0; i < sz; i++){*p = 1;p++; // p+1 跳过4个字节,直接操作第二个元素}for (i = 0; i < sz; i++){printf("%d", arr[i]);}return 0;
}

二、指针 - 指针

  • 指针 - 指针, 就是两个指针之间元素的个数。
  • 指针 - 指针的前提条件是 指向同一个空间的2个指针才能相减。
#include <stdio.h>// 求字符数组的长度// 1. 指针 - 指针求字符串长度
int my_strlen(char* p)
{char* start = p;while (*p != '\0'){p++;}return (p - start);
}
int main()
{int num = my_strlen("abcdef");printf("%d", num); // 6return 0;
}
---------------------------------------------------------------------------------// 2. 求字符串长度通过while循环计数
int my_strlen(char* p)
{int count = 0;while (*p != '\0'){count++;p++;}return count;
}
int main()
{int num = my_strlen("abcdef");printf("%d", num); // 6return 0;
}
-------------------------------------------------------------------------------------
// 3. 递归求字符串长度
int my_strlen(char* p)
{if (*p == '\0')return 0;elsereturn 1 + my_strlen(p + 1);
}
int main()
{int num = my_strlen("abcdef");printf("%d", num); // 6return 0;
}
  • 指针加指针一般没有意义
  • 比如:
  • 日期加天数 -----有意义
  • 日期减天数 -----有意义
  • 日期减日期 -----有意义
  • 日期加日期 -----无意义

三、指针的关系运算

#include <stdio.h>
#define N 5int main()
{int* vp = NULL;int arr[N] = { 1,2,3,4,5 };
--------------------------------------------------------------------------------for (vp = &arr[N]; vp > &arr[0];) {*--vp = 0;}
--------------------------------------------------------------------------------// N = 5 是 arr[4] 和 它后面的内存位置的指针进行比较int i = 0;for (i = 0; i < N; i++){printf("%d", arr[i]); // 数组元素修改为0}return 0;
}

#define N 5int main()
{int* vp = NULL;int arr[N] = { 1,2,3,4,5 };
-----------------------------------------------------------------------------------------for (vp = &arr[N-1]; vp >= &arr[0]; vp--) {*vp = 0;}// 这种写法 当 vp 为 0 的时候,是 arr[0] 和 它之前的内存位置指针比较
-----------------------------------------------------------------------------------------int i = 0;for (i = 0; i < N; i++){printf("%d", arr[i]); // 数组元素修改为0}return 0;
}
  • 实际上绝大部分的编译器上两种都是可以顺利完成任务的,但是我们应该避免这种写法,因为表中并不保证它可行。
  • 标准规定:
  • 允许指向数组元素的指针与指向数组最后一个元素后面的哪个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

四、指针和数组

  • 指针就是用来存放地址的。
  • 数组就是一组相同类型的数值的组合。
  • 数组名一般情况下表示首元素地址。
  • 所以可以通过一下三种方法打印数组。
#include <stdio.h>
void test(int* arr, int sz)
{int i = 0;int* p = arr; // 首元素地址存入指针变量 pfor (i = 0; i < sz; i++){printf("%d------------%d \n", *(arr + i), *(p + i));// 均可以打印出数组// arr 表示首元素地址, p 也表示首元素地址}
}void test1(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]); // 打印数组}
}int main()
{int arr[10] = { 0 };test(arr, 10);test1(arr, 10);return 0;
}

五、二级指针

在这里插入图片描述

  1. 一级指针
int main()
{int a = 0;int* pa = &a; // 我们说,这里的pa 是一个一级指针*pa = 20;printf("%d", a);return 0;
}
  1. 二级指针
int main()
{int a = 0;int* pa = &a; // 我们说,这里的pa 是一个一级指针// 此时获取a的地址存放到pa变量中// pa 变量是在内存中开辟了 4 个大小空间(32位)存放 a 的地址&pa; // 获取 pa 变量的地址int** ppa = &pa; // 获取 pa 的地址,在内存中申请大小为 4 的空间 ppa,存放pa地址// 这里的ppa就是一个二级指针**ppa = 20;// *ppa 指向变量 pa// **ppa 指向变量 aprintf("%d", a);return 0;
}

六、指针数组

  • 存放指针的数组就是指针数组,本质上是一个数组。
#include <stdio.h>
int main()
{int a = 10;int b = 20;int c = 30;int* parr[10] = { &a, &b, &c };int i = 0;for (i = 0; i < 3; i++){printf("%d ", *parr[i]);// parr[i] <==> *(parr+i)// 以i = 0 来说明// 这里的*(parr+i)指向的是 &a// 再解引用指向 a}return 0;
}

指针数组可以将几个一维数组模拟成二维数组

int main()
{int arr1[4] = { 1,2,3,4 };int arr2[4] = { 2,3,4,5 };int arr3[4] = { 3,4,5,6 };int* parr[10] = { &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]);// 这里 parr[i] <==> *(parr+i)// // parr[i][j] <==> *(parr[i]+j) <==> *(*(parr+i)+j)// 以 i = 0 j = 0 为例// *(parr+i) 指向 &arr1// *(*(parr+i)+j) <==> *(&arr1) 指向 arr1 的首元素}printf("\n");}return 0;
}

总结

C语言指针±整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍,还包括指针数组将几个一维数组模拟为二维数组等的介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】---STL之vector的模拟实现

【C】---STL之vector的模拟实现 一、vector在源码中的结构&#xff1a;二、vector类的实现&#xff1a;1、vector的构造2、析构3、拷贝构造4、赋值运算符重载5、迭代器6、operator[ ]7、size()8、capacity()9、reserve()10、resize()11、empty()12、push_back()13、pop_back()1…

基于JAVA的机场航班起降与协调管理系统

毕业设计&#xff08;论文&#xff09;任务书 第1页 毕业设计&#xff08;论文&#xff09;题目&#xff1a; 基于JAVA的机场航班起降与协调管理系统 毕业设计&#xff08;论文&#xff09;要求及原始数据&#xff08;资料&#xff09;&#xff1a; 1&#xff0e;综述机场航班调…

JRebel热部署SpringBoot+MyBatis-Plus实现不重启更新修改后MyBatis的XML文件

安装JRebel热部署插件 《JRebel插件安装教程》 《JRebel mybatisPlus extension下载Zip离线安装》 在线安装JRebel mybatisPlus extension 插件商店直接搜JRebel mybatisPlus extension pom.xml 引入依赖 <dependency><groupId>com.baomidou</groupId>…

裤裤带你一起学C语言内存函数啦!

目录 1.memcpy的使用和模拟实现 2.memmove使用和模拟实现 3.memset函数的使用 4.memcmp函数的使用 内存函数在<string.h>库中&#xff0c;我们使用内存函数必须先引入<string.h>头文件 1.memcpy的使用和模拟实现 memcpy的函数原型如下&#xff1a; void * m…

大模型热潮下,AI数据集的重要性及发展现状

2023年3月14日&#xff0c;OpenAI发布了多模态大模型的最新版本GPT-4&#xff1a;文生视频大模型Sora&#xff0c;Sora通过采用更大规模的数据集进行训练,其推理能力超过了ChatGPT&#xff0c;已成为目前最成功、最受欢迎的大模型。 Sora的出现&#xff0c;打破了人们对AI技术…

sketchup{su}安装错误1402

错误如图 解决方法如下 打开autoremove&#xff0c;点击扩展&#xff0c;输入1402&#xff0c;点击搜索 等待修复成功既可尝试重新安装su 软件每周六选择其他方式登录免费使用

SCP收容物091~100

注 &#xff1a;此文接SCP收容物081~090,本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-091 scp-092 scp-093 scp-094 scp-095…

RF高频腔设计(7)

3.11 高阶模 之前我们说过&#xff0c;由于束流负载或者其它的原因会在RF高频腔中激发出很多模式&#xff0c;这些模式可能会对束流的稳定性造成不利的影响&#xff0c;尤其是腔的 R / Q ∗ Q L R/Q*Q_L R/Q∗QL​很高时。 为了解决这个问题&#xff0c;需要使用HOM阻尼器来抑…

缓解工作压力的小窍门:保持健康与创新

目录 1 前言2 工作与休息的平衡3 保持心理健康4 社交与网络建设5 结语 1 前言 作为程序员&#xff0c;我们常常承受着高度的工作压力和持续的创新挑战。为了保持高效和健康&#xff0c;我们需要采取一些方法来缓解工作压力&#xff0c;同时促进个人的心理和身体健康。 2 工作…

Android—— log的记忆

一、关键log 1.Java的 backtrace(堆栈log) 上述是一个空指针异常&#xff0c;问题出现在sgtc.settings&#xff0c;所以属于客户UI问题。 2.WindowManager(管理屏幕上的窗口和视图层次结构) 3.ActivityManager(管理应用程序生命周期和任务栈) 4.wifi操作 (1) 连接wifi&#…

安卓原生项目工程结构说明

.gradle 和 .idea (自动生成) .gradle 是gradle下载好的缓存&#xff0c;如果有配置好的 下载好的缓存 直接会拿来用 没有会下载 生成 .idea 是编辑器的配置 app 代码主逻辑 目录 项目中的代码 资源都会在里面 工作的时候的核心目录 gradle 下载安卓的构建器gradle相关的配置信…

Linux c++ onvif客户端开发(8):GetServices

本文是Linux c onvif客户端开发系列文章之一&#xff1a; Linux c onvif客户端开发(1): 根据wsdl生成cpp源文件Linux c onvif客户端开发(2): 获取摄像头H264/H265 RTSP地址Linux c onvif客户端开发(3): 扫描设备Linux c onvif客户端开发(4): 扫描某个设备是否支持onvifLinux c…

目标检测——野火数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

八股中的记录

1. protected修饰符&#xff1a;同包或子类&#xff08;不同包&#xff09; 区分普通人和专业人调用的一些方法 2. 抽象&#xff1a;abstract修饰类和方法 抽象类不可实例化&#xff0c;避免错误的new对象 抽象方法是用abstract修饰的方法声明&#xff0c;没有方法体&#xff…

【k8s】Kubernetes 1.29.4离线安装部署(总)

&#xff08;一&#xff09;kubernetes1.29.4离线部署之-安装文件准备 &#xff08;二&#xff09;kubernetes1.29.4离线部署之-镜像文件准备 &#xff08;三&#xff09;kubernetes1.29.4离线部署之-环境初始化 &#xff08;四&#xff09;kubernetes1.29.4离线部署之-组件安装…

好看的混淆矩阵

网上绘制的混淆矩阵都不太满意。。。经过本人多次实验&#xff0c;如下混淆矩阵最为美观&#xff0c;特此记录 import matplotlib matplotlib.use(Agg) from matplotlib import rcParamsimport matplotlib.pyplot as plt import numpy as np# 给定混淆矩阵 cm np.array([[683…

使用可穿戴传感器和设备进行压力检测——综述摘录

用于压力检测的设备&#xff1a; Empatica E4腕带&#xff1a;该设备是腕带&#xff0c;是实时生理数据流和可视化传感器。作为医疗级可穿戴设备&#xff0c;它使研究人员能够收集多种生理数据&#xff0c;例如用于HRV分析的BVP&#xff0c;以及反映皮肤特定区域不断波动的电特…

2024用云渲染好还是自己渲染好!

​cg动画的渲染上经常需要使用到“云渲染”&#xff0c;当然也有小型的动画渲染使用的自己本地电脑渲染。云渲染可节省时间&#xff0c;减少硬件投资&#xff1b;本地电脑渲染就比较灵活的&#xff0c;但是需要高配置的硬件支持&#xff0c;那么两者那个好呢&#xff0c;一起来…

第一个Spring Boot程序

目录 一、Spring Boot介绍 二、创建Spring Boot项目 1、插件安装&#xff08;专业版不需要&#xff09; 2、创建SpringBoot项目 &#xff08;1&#xff09;这里如果插件下载失败&#xff0c;解决方案&#xff1a; &#xff08;2&#xff09;项目启动失败&#xff0c;解决…

skywalking-agent 代码调试

之前已经将 oap 和 ui 调试成功了&#xff0c;今天排查一个 agent 的采集问题&#xff0c;又研究了下 agent 代码如何调试&#xff0c;这下终于齐活了&#xff0c;以后 skywalking 再有问题&#xff0c;直接使用调试大法。 废话不多说&#xff0c;我们看下如何搞&#xff0c;步…