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); // 6

	return 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); // 6

	return 0;
}
-------------------------------------------------------------------------------------
// 3. 递归求字符串长度
int my_strlen(char* p)
{
	if (*p == '\0')
		return 0;
	else
		return 1 + my_strlen(p + 1);
}
int main()
{
	int num = my_strlen("abcdef");

	printf("%d", num); // 6

	return 0;
}
  • 指针加指针一般没有意义
  • 比如:
  • 日期加天数 -----有意义
  • 日期减天数 -----有意义
  • 日期减日期 -----有意义
  • 日期加日期 -----无意义

三、指针的关系运算

#include <stdio.h>
#define N 5

int 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 5

int 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; // 首元素地址存入指针变量 p
	for (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 指向变量 a
	printf("%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语言指针±整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍,还包括指针数组将几个一维数组模拟为二维数组等的介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32的端口引脚的复用功能及重映射功能解析

目录 STM32的端口引脚的复用功能及重映射功能解析 复用功能 复用功能的初始化 重映射功能 重映射功能的初始化 复用功能和重映射的区别 部分重映射与完全重映射 补充 STM32的端口引脚的复用功能及重映射功能解析 复用功能 首先、我们可以这样去理解stm32引脚的复用功能…

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 &#xff08;1&#xff09;复习Neutron网络资源模型。 &#xff08;2&#xff09;重点理解网络、子网、端口和路由器的概念。 【实…

定制自己的 AI 角色CustomChar;AI知识点和面试题;提高llama 3 的微调速度Unsloth

✨ 1: CustomChar 允许你创建和定制自己的 AI 角色 CustomChar 是一个开源项目&#xff0c;它允许你创建和定制自己的 AI 角色。无论是游戏中的角色&#xff0c;还是个人的虚拟助手&#xff08;比如电脑上的 JARVIS&#xff09;&#xff0c;甚至是在线教育体验中的虚拟朋友或…

vue列表穿梭框,可进行前端查询

// 这是组件,可以直接用 <template><div class"box"><el-row><el-col :span"11"><div class"box_left"><SearchContent :queryParams"queryParams" query"handleQuery" reset"resetQ…

rtthread 使用 scons 生成的项目

Env 工具 Env 是 RT-Thread 推出的开发辅助工具&#xff0c;针对基于 RT-Thread 操作系统的项目工程&#xff0c;提供编译构建环境、图形化系统配置及软件包管理功能。 其内置的 menuconfig 提供了简单易用的配置剪裁工具&#xff0c;可对内核、组件和软件包进行自由裁剪&…

【Linux】学习记录_14_线程

14 线程 14.1 线程和进程 进程是资源管理的最小单位&#xff0c;每个进程都有数据段、代码段和堆栈段&#xff0c;进程切换时都有复杂的上下文切换等动作。进程切换上下文时&#xff0c; 需要重新映射虚拟地址空间、进出OS内核、寄存器切换&#xff0c;还会干扰处理器的缓存机…

2010年认证杯SPSSPRO杯数学建模C题(第一阶段)高校图书馆的智能服务全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 C题 高校图书馆的智能服务 原题再现&#xff1a; 图书馆源于保存记事的习惯。图书馆是为读者在馆内使用文献而提供的专门场所。而高校的图书馆为教学和科研服务&#xff0c;具有服务性和学术性强的特点。   现在的高校图书馆存在着许多不良的…

华为交换机重置密码

1.进入bootrom 加电后&#xff0c;18S左右&#xff0c;在启动菜单按 CtrlB 进入bootrom&#xff08;3s内&#xff09; 注意&#xff1a;本步骤属于高危操作&#xff0c;一定小心切勿删除系统或修改bootrom密码&#xff01; 输入bootrom密码&#xff0c;按6 看到提示成功后按…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍&#xff0c;全部在jdk8环境下运行的&#xff1b; jps ☆☆☆☆☆ 查看当前运行的进程号&#xff1b; jmap ☆☆☆ jmap命令可以查看jvm的内存信息&#xff0c;class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

网动统一通信平台(Active UC) downloadDocument.action 任意文件读取漏洞复现

0x01 产品简介 网动统一通信平台(Active UC) 是一个涵盖了多种通信功能的综合平台&#xff0c;通常包括文字、语音、视频通讯等功能&#xff0c;并且可能提供了一系列的通讯工具和服务。这样的平台通常旨在提升用户的沟通效率和便利性&#xff0c;为用户提供一个统一的通信环境…

Tomcat源码解析——一次请求的处理流程

在上一篇文章中&#xff0c;我们知道Tomcat在启动后&#xff0c;会在Connector中开启一个Acceptor(接收器)绑定线程然后用于监听socket的连接&#xff0c;那么当我们发出请求时&#xff0c;第一步也就是建立TCP连接&#xff0c;则会从Acceptor的run方法处进入。 Acceptor&…

用户体验至上:独立站脱颖而出的关键要素解析

在数字化时代&#xff0c;独立站成为了许多品牌和企业展示自身形象、推广产品、建立客户联系的重要平台。然而&#xff0c;要想在众多的独立站中脱颖而出&#xff0c;吸引并留住用户&#xff0c;良好的用户体验至关重要。本文Nox聚星将和大家探讨如何做好独立站的用户体验&…

antDesignPro ProForm表单里使用dependencies属性

场景&#xff1a;ProForm表单里前一个下拉框选择的值带出后面下拉框的枚举值 <script><ProFormformRef{formRef}onFinish{{}}><ProForm.Group><ProFormSelectname"projectId"label"项目"width"sm"request{projectList}plac…

echerts饼图分割操作

在饼图制作中遇到了一个难点就是饼图中间是分散的 试了很多方法&#xff0c;最后选择了给每个值中间再加一节的处理方式&#xff0c;并把颜色设置为透明就能达到相同效果。 处理后的样式&#xff1a; 代码&#xff1a; let list this.data.list;/饼图内部展示数据// let _t…

文心一言 VS 讯飞星火 VS chatgpt (242)-- 算法导论17.4 1题

一、假定我们希望实现一个动态的开地址散列表。为什么我们需要当装载因子达到一个严格小于 1 的值 a 时就认为表满&#xff1f;简要描述如何为动态开地址散列表设计一个插入算法&#xff0c;使得每个插入操作的摊还代价的期望值为 O(1) 。为什么每个插入操作的实际代价的期望值…

React基础知识大汇总

函数组件和类组件 函数组件与类组件有什么区别呢&#xff1f; function getName(params:{name:string}){const count 0;return params.name -count; } getName({name:"test"}) getName({name:"哈哈哈"})getName是一个纯函数&#xff0c;不产生任何副作用…

54、图论-实现Trie前缀树

思路&#xff1a; 主要是构建一个trie前缀树结构。如果构建呢&#xff1f;看题意&#xff0c;应该当前节点对象下有几个属性&#xff1a; 1、next节点数组 2、是否为结尾 3、当前值 代码如下&#xff1a; class Trie {class Node {boolean end;Node[] nexts;public Node(…

nginx配置挂载html

目标 很多软件的官方文档&#xff0c;在国内打开很慢&#xff0c;每次都得等很久&#xff0c;看到官方同时提供了html的包&#xff0c;所以想着挂载到本地nginx下&#xff0c;查看会方便很多。 下载官方html文档包&#xff0c;解压到documentation_htmls下 想添加新的文档也是…

Sql Server 数据库:查询表结构脚本

查询脚本: SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ) AS 列说明 , t.name AS 数据类型 , col.length AS 长度 , ISNULL(COLUMNPROPERTY(col.id, col.name, Scale), 0) AS 小数位数…

<开源> 轮廓内缩外扩算法

轮廓内缩外扩算法 项目是论文A new offset algorithm for closed 2D lines with Islands的JAVA实现。 项目的GitHub地址&#xff1a;https://github.com/Lee-0o0/polygon-offset-algorithm。 参考博客 https://blog.csdn.net/qq_41261251/article/details/114462696