C语言基础之——指针(下)

news2024/11/15 18:01:52

前言:本篇文章将继续讲解有关指针的剩余基础知识。

学无止境,一起加油叭!!


目录

一.指针运算

1.指针 +- 整数

 2.指针的关系运算

 3.指针 - 指针

二.指针与数组

三.二级指针

四.指针数组

总结


一.指针运算

指针运算包括以下三种:

  • 指针 +- 整数
  • 指针 - 指针
  • 指针的关系运算

1.指针 +- 整数

我们尝试用指针来打印一个数组的内容:

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;//数组名是数组首元素的地址
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

我们在指针(上)中已经了解到,指针+-整数能够实现指针的跳动。

那么我们便能够根据这个办法来实现打印数组:

p指向的是数组的首元素地址,那么p + i就等于是指针跳到了数组下标为 i 的元素的地址

当然要实现这一点就必须要求数组和指针变量是相同的数据类型

 2.指针的关系运算

指针与指针之间也是可以比较大小的,比较的是指针所指向的地址的大小。

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p1 = &arr[4];
	int* p2 = &arr[5];
	if (*p1 > *p2)
	{
		printf("hehe");
	}
	else
	{
		printf("haha");
	}
	return 0;
}

例如我们来比较一下p1和p2的大小,结果如下:

 3.指针 - 指针

指针-指针的实现必须满足两个条件:

  1. 两个指针指向同一块区域(一个数组等)
  2. 两个指针的类型相同
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p1 = &arr[9];
	int* p2 = &arr[0];
	printf("%d", p1 - p2);
	return 0;
}

来看上边的代码,会得到什么结果呢???

结果是9,有的小伙伴可能会猜是36,以为会是两个指针之间的字节个数

而实际上是两个指针之间的元素个数

二.指针与数组

如上代码,之所以能把数组和指针联系在一起,是因为数组名可以表示数组首元素的地址

但是数组名也有不同的用法:

  1. 1.sizeof(数组名):数组名单独放在sizeof内部,数组名则代表整个数组,计算的是数组的大小,单位是字节。
  2. &数组名:数组名代表整个数组,取出的是数组的地址,数组的地址和数组首元素的地址值是一样的,但是类型和意义是不一样的。

 三.二级指针

    int a = 5;
    int* p = &a;//p是指针变量,一级指针变量
    int** pp = &p;//pp是指针变量,二级指针变量

这样也很像套娃对不对,所谓二级指针,也就是存放一级指针变量地址的指针。当然也可以有三级、四级、五级等等等等,但是一般都不会用到,包括二级指针也是不常用的。

那么二级指针如果想要找到a的地址,就要解引用两次,第一次是找到*p的地址,第二次才能找到a的地址,所以要用** pp

四.指针数组

听到这个名字可能很多小伙伴会产生疑惑,这个到底是指针还是数组呢???

答案是数组

我们听说过整型数组,浮点型数组,字符数组,它们分别是存放整形、浮点型、字符的数组

那么指针数组也就是存放指针变量的数组

char* arr[5];//存放字符型指针的数组

int* arr2[4];//存放整型指针的数组

那么指针数组到底有什么用处呢???

我们可以用指针数组来模拟实现一个二维数组:

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 6,7,8,9,10 };
	int arr3[] = { 11,12,13,14,15 };
	int* arr[] = { arr1,arr2,arr3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

我们已经知道数组名是数组首元素的地址,所以我们就可以直接将数组名传入指针数组中,这样我们就相当于直接得到了三行元素,并且可以用相同的方法进行打印:

虽然模拟出来二维数组的样子,但其实并不是真的二维数组,我们知道二维数组的元素内存地址都是相连的,但这里我们所创建的三个数组都是互不相连的。

总结

指针的基础知识到这里就要结束啦,希望小伙伴们都能有所收获!

喜欢博主文章的小伙伴们不要忘记一键三连哦!下期我们将对结构体展开讲解,一起期待一下叭!

我们下期再见! 

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

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

相关文章

Tableau可视化入门实践-2

目录 折线图1.导入excel文件数据2.建立折线图并添加标签 双轴折线图 折线图 1.导入excel文件数据 2.建立折线图并添加标签 双轴折线图 行标签拖进两个度量建立上下两个折线图 在第二个折线图纵轴&#xff0c;右键选择“双轴”

DiskCatalogMaker for Mac简单智能快速的磁盘管理工具

DiskCatalogMaker是一款Mac上的磁盘目录管理工具。它可以帮助用户快速创建和管理磁盘目录&#xff0c;方便查找和访问存储在磁盘上的文件和文件夹。它具有快速扫描和索引功能&#xff0c;生成详细的目录列表&#xff0c;支持关键字搜索和自定义标签。 此外&#xff0c;DiskCat…

k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令

1. 使用kuberadm 安装成功后&#xff0c;clear清除了屏幕数据&#xff0c;加入命令无法查看&#xff0c;使用如下&#xff0c;重新查看node如何加入主节点命令&#xff1a; kubeadm token create --print-join-command --ttl 0 2.画圈的全部是&#xff0c;都复制&#xff0c;在…

反转链表00

题目链接 反转链表 题目描述 注意点 链表中节点的数目范围是 [0, 5000] 解答思路 迭代或递归解决本题 代码 方法一&#xff1a; // 迭代 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode pre…

【原创】jmeter并发测试计划

bankQPS 创建线程组 设置并发参数 HTTP请求GET 添加HTTP请求 GET请求 查看结果树 HTTP请求 POST 添加HTTP请求 参数必须设置头信息格式&#xff1a; 添加HTTP头信息 查看结果树 可以选择&#xff0c;仅查看错误日志 汇总报告

【LLM】解析pdf文档生成摘要

文章目录 一、整体思路二、代码三、小结Reference 一、整体思路 非常简单的一个v1版本 利用langchain和pdfminer切分pdf文档为k块&#xff0c;设置overlap等参数先利用prompt1对每个chunk文本块进行摘要生成&#xff0c;然后利用prompt2对多个摘要进行连贯组合/增删模型可以使…

keras深度学习框架通过简单神经网络实现手写数字识别

背景 keras深度学习框架&#xff0c;并不是一个独立的深度学习框架&#xff0c;它后台依赖tensorflow或者theano。大部分开发者应该使用的是tensorflow。keras可以很方便的像搭积木一样根据模型搭出我们需要的神经网络&#xff0c;然后进行编译&#xff0c;训练&#xff0c;测试…

4.22 TCP 四次挥手,可以变成三次吗?

目录 为什么 TCP 挥手需要四次呢&#xff1f; 粗暴关闭 vs 优雅关闭 close函数 shotdown函数 什么情况会出现三次挥手&#xff1f; 什么是 TCP 延迟确认机制&#xff1f; TCP 序列号和确认号是如何变化的&#xff1f; 在一些情况下&#xff0c; TCP 四次挥手是可以变成 T…

如何识别PCI/PCIE设备需要申请多大的地址空间?

1、PCI/PCIE设备的配置空间 (1)PCI/PCIE设备需要的资源都在配置空间里进行指定&#xff0c;其中需要的地址空间资源在配置空间的基地址寄存器里指定&#xff1b; (2)参考博客&#xff1a;《PCI设备和PCI桥的配置空间(header_type0、header_type1)和配置命令(type0、type1)详解》…

交叉编译 libzdb

参考博客&#xff1a;移植libzdb3.2.2到arm_configure: error: no available database found or s_酣楼驻海的博客-CSDN博客 编译时间 2023-08-23 libzdb 下载&#xff1a; 源码访问如下&#xff1a; https://bitbucket.org/tildeslash/libzdb/src/master/ git 下载链接 …

JavaScript设计模式(一)——构造器模式、原型模式、类模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Lottery抽奖项目学习第二章第一节:环境、配置、规范

Lottery抽奖项目学习第二章第一节&#xff1a;环境、配置、规范 环境、配置、规范 下面以DDD架构和设计模式落地实战的方式&#xff0c;进行讲解和实现分布式抽奖系统的代码开发&#xff0c;那么这里会涉及到很多DDD的设计思路和设计模式应用&#xff0c;以及互联网大厂开发中…

【GoLang】go入门:go语言执行过程分析 常见数据类型(基本数据类型)

1、go语言执行过程分析 【1】执行流程分析 通过 go build 进行编译 运行上一步生成的可执行文件 通过 go run 命令直接运行 【2】上述两种执行流程的区别 在编译时&#xff0c;编译器会将程序运行时依赖的库文件包含在可执行文件中&#xff0c;所以可执行文件会变大很多通过g…

c++中的基本类型

专栏简介&#xff1a;为什么我要重新介绍c的相关知识&#xff0c;在此之前&#xff0c;我对于c的了解也仅仅是在表面。而在后来与c慢慢的接触中&#xff0c;c编程语言越来越让我觉得深奥&#xff0c;所以还是想要重新开创一个专栏来介绍c。对于c的介绍&#xff0c;本专栏会先介…

学会shell 基本语法,玩转linux

01、获取当前时间&#xff0c;年月日时分秒 now$(date %Y%m%d%H%M%S) echo "$now" 输出为&#xff1a;20181202222727 02、date 在脚本中的几种用法 date %Y 以 4 位数字格式打印年份 date %y 以 2 位数字格式打印年份 date %m 月份 date %d 日期 date %H 小时 d…

IO模型和NGINX安装升级

IO模型和NGINX安装升级 IO模型 IO概念 I/O在计算机中指Input/Output&#xff0c; IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)&#xff0c;是衡量磁盘性能的主要指标之一。 Linux的IO类型 磁盘I/O 磁盘I/O是进程向内核发起系统调用&#xff0c;请求磁…

抖店出单后怎么操作?谈厂家话术与发货注意事项,抖店最新教程

我是王路飞。 当你的抖店出单后&#xff0c;你是怎么操作的? 还是像之前那样去拼多多代拍发货&#xff1f;这样做的商家&#xff0c;不知道你的店铺被封了几个了&#xff1f; 记住&#xff0c;现在抖店出单后&#xff0c;一定不要再去多多拍单发货了&#xff01; 关于抖店…

0基础入门C++之类和对象下篇

目录 1.再谈构造函数1.1构造函数赋值1.2初始化列表1.3explicit关键字 2.static成员2.1概念2.1静态成员变量2.2静态成员函数2.3特性 3.匿名对象4.友元函数4.1友元函数4.2友元类 5.内部类6.再次理解类和对象 1.再谈构造函数 首先我们先来回忆一下构造函数&#xff1a; 构造函数是…

【springboot】springboot定时任务:

文章目录 一、文档&#xff1a;二、案例&#xff1a; 一、文档&#xff1a; 【cron表达式在线生成器】https://cron.qqe2.com/ 二、案例&#xff1a; EnableScheduling //开启任务调度package com.sky.task;import com.sky.entity.Orders; import com.sky.mapper.OrderMapper; …

CAN总线学习——物理层、数据链路层、CANopen协议

1、CAN总线介绍 1.1、CAN总线描述 (1)CAN总线支持多节点通信&#xff0c;但是节点不分区主从&#xff0c;也就是不存在一个节点来负责维护总线的通信&#xff1b;这点可以和I2C总线对对比&#xff0c;I2C是一主多从模式&#xff1b; (2)是差分、异步、串行总线&#xff0c;采用…