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://www.mzph.cn/pingmian/2103.shtml

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

相关文章

武汉大学博士,华为上班5年多,月薪多少。。。

最近&#xff0c;一位来自武汉大学的博士研究生透露了自己在华为公司工作五年后的薪酬情况。 据他透露&#xff0c;他在2018年加入华为时的月薪为2.4万&#xff0c;随着时间的推移&#xff0c;到了2023年&#xff0c;他的月薪已经增长至4.4万&#xff01;此外&#xff0c;他还透…

AI时代的GPU集群网络算力分析

浅谈GPU集群网络、集群规模和集群算力 引言在生成式AI&#xff08;GenAI&#xff09;和大模型时代&#xff0c;不仅需要关注单个GPU卡的算力&#xff0c;更要关注GPU集群的总有效算力。单个GPU卡的有效算力可以通过该卡的峰值算力来测算&#xff0c;例如&#xff0c;对于Nvidia…

网络工程师----第十一天

OSPF&#xff1a; 对称加密算法&#xff1a; 也称为私钥加密或单密钥算法&#xff0c;是一种加密方式&#xff0c;其中加密和解密使用相同的密钥。这种算法的优点包括加密解密速度快、计算量小&#xff0c;适用于大量数据的加密。然而&#xff0c;它的缺点是密钥的安全性难以保…

深度相机(3D相机)

传统的RGB彩色相机称为2D相机&#xff0c; 只能得到2D的图像信息&#xff0c; 无法得到物体与相机的距离信息&#xff0c;也就是深度信息。 顾名思义&#xff0c; 深度相机除了获取2D信息&#xff0c;还能得到深度信息&#xff0c;也叫RGBD相机&#xff0c; 或3D相机。 顺便提…

被删除的照片和视频能找回吗?如何恢复手机删除的照片和视频?

手机里的照片和视频是我们记录生活的每一个瞬间&#xff0c;也是工作学习等场合经常用到的东西&#xff0c;一旦不慎丢失&#xff0c;将对我们造成很大损失。那么我们该如何恢复手机删除的照片和视频呢&#xff1f;通过掌握正确的恢复方法&#xff0c;能够最大程度地保护手机中…

网络常识!!!

网络常识!!! 一:网络的发展史二:关键的概念三:IP地址四:端口号二级目录二级目录二级目录二级目录三级目录 一:网络的发展史 从游戏方面发展历程进行理解: 从单机游戏-----游戏支持局域网对战-------游戏支持广域网对战-------移动端 (1)局域网对战:在同一个网吧里,不同的游戏…

2016年新华三杯复赛实验试题

2016年新华三杯复赛实验试题 拓扑图 配置需求 考生根据以下配置需求在 HCL 中的设备上进行相关配置。 以太网接口配置 将 S1、S2 的以太网接口 G1/0/1 至 G1/0/16 的模式用命令 combo enable copper 激活为电口。 虚拟局域网 为了减少广播&#xff0c;需要规划并配置 VLA…

Seurat -- Introduction to scRNA-seq integration 跟随学习记录

文章目录 数据是如何转换的原始ifnb数据对象Splits object后的数据对象数据对象构建完成后的标准流程Normalization后的数据对象scale 后的数据对象 不同的样本进行整合JoinLayers干了什么 数据是如何转换的 seurat object 中assays R N A l a y e r s RNAlayers RNAlayersco…

新的全息技术突破计算障碍

一种突破性的方法利用基于Lohmann透镜的衍射模型实时创建计算机生成全息图&#xff08;CGH&#xff09;&#xff0c;在保持3D可视化质量的同时&#xff0c;大大降低了计算负荷要求。 全息显示为制作逼真的三维图像提供了一条令人兴奋的途径&#xff0c;这种图像给人以连续深度…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了&#xff0c;大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种&#xff0c;一种是srun&#xff0c;这种所见即所得的申请方式一般适用于短期的调试使用&#xff0c;大概一般允许的时间从几个小时到1天左右&…

flutter 设置启屏页 flutter_native_splash 坑记录

flutter_native_splash | Flutter packageCustomize Flutters default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.https://pub.dev/packages/flutter_native_splash 发现一直白屏 原因是 代码中 下面…

图书租赁系统

网上出版的电子书只有购买服务&#xff0c;如果也有租赁服务就好了。例如&#xff0c;读者可以租个1个小时&#xff0c;1个小时到期&#xff0c;读者就不能阅读该书。 图中借阅结束时间是2024-04-23 13:36:29&#xff0c;到期后该书就会从列表中消失。 BookOrderMapper.xml &…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

直流负载在新能源领域的作用有哪些

直流负载在新能源领域的作用主要体现在以下几个方面&#xff1a; 新能源如太阳能、风能等&#xff0c;其发电过程中产生的电能为直流电。传统的电力系统主要采用交流电&#xff0c;因此在新能源并网时需要进行逆变器转换。然而&#xff0c;逆变器在转换过程中会存在一定的能量损…

【话题】为什么选择成为了一名程序员?

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景沉迷游戏回归学习机缘巧合兴趣驱动的选择职业发展的考虑兴趣与职业发展的结合结论文章推荐 背景 选择程序员之路&#xff1a;兴趣驱动还是职业发展&#xff1f; 在…

IntelliJ IDEA2020下使用Maven构建Scala 项目

1.创建maven文件 2.进入pom.xml导入依赖 <!--添加spark的依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.1</version></dependency><!--添加scala依…

YOLC: You Only Look Clusters for Tiny Object Detection in Aerial Images

摘要 由于以下因素,从航拍图像中检测物体面临着重大挑战:1)航拍图像通常具有非常大的尺寸,通常有数百万甚至数亿像素,而计算资源有限。2)物体尺寸较小导致有效信息不足,无法进行有效检测。3)物体分布不均匀导致计算资源浪费。为了解决这些问题,我们提出YOLC(You Onl…

让更多的人能使用AI才能提升国内AI竞争力

随着人工智能技术的快速发展,AI正在深入影响我们的生活和工作。然而,目前AI技术的使用和应用主要集中在少数大型科技公司和研究机构,普通大众对AI技术的接触和使用还相对有限。如何让更多的人能够便捷地使用AI,从而带动整个国内AI产业的发展,已成为当前亟需解决的问题。 首先…

(实测可用)(2)Git的使用——如何在CSDN代码托管平台gitcode上托管自己的代码进行管理

一、CSDN 代码托管与Git使用 1、登录GitCode注册账号 (1)登录CSDN首页,选择GitCode; 2、生成SSH秘钥 (1)由于我们的本地git仓库和 GitCode仓库之间的传输是通过SSH加密的,所以我们需要配置SSH密钥。 注:安装了git工具,就可以使用ssh命令 (2)打开cmd命令行,输入…

Apache POI报表统计

Apache POl是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POl 在 Java 程N序中对Miscrosoft Office各种文件进行读写操作。一般情况下&#xff0c;POI都是用于操作 Excel 文件。 导入Maven坐标&#xff1a; <dependency>&l…