首页 > 其他分享 >【C语言】指针的运算

【C语言】指针的运算

时间:2024-10-25 22:21:31浏览次数:3  
标签:arr 运算 int 元素 C语言 地址 数组 指针

目录

1.指针加减整数

指针加减整数并不是简单的地址加减。在计算机内存中,每个变量都有一个唯一的存储位置,这个位置由其地址表示。当你对指针执行加法或减法操作,并传递一个整数值,实际上是改变了指针指向的位置,使其指向新的地址。这个新地址通常对应于原来地址基础上增加或减少指定的字节数,这取决于所使用的数据类型(比如int、char等)的大小。

举个例子,

如果你有一个指向整数的指针,将它加上一个整数意味着指针会移动相应整数的字节数。

而如果是在C/C++这样的语言中,数组下标运算本质上也是通过这种指针加减来实现的,因为数组名就是一个常量指针,数组元素可以通过指针算术访问。
我们通过下面一段代码来解释:

#include<stdio.h>
int main()
{
int arr[9]={1,2,3,4,5,6,7,8,9};
int *p=&arr;
for(int i=0;i<9;i++)
{
printf("%d ",*p);
p++;
}
return 0;
}

在这段代码中,我们定义了一个整形数组arr[9]并将其初始化,接着我们定义了一个整形指针变量p并将数组首元素的地址赋值给了p,那么指针指向的内容就是数组的首元素,接着通过for循环输出打印数组元素,在每次打印完数组元素后将p++。
输出显示结果:
在这里插入图片描述
首先我们要知道

地址变量+整数是原地址加上整数*sizeof(int)个字节

因为p++其实就是p=p+1,又因为p是整形指针变量,所以p+1就是在p存储的地址上增加四个字节。因此代码中每执行一次for循环,都会让指针变量p的地址增加四个字节,由于数组的存储是连续的,所以每次循环,指针都会指向数组的下一个元素

2.指针减指针

指针减指针的绝对值是指针与指针之间的元素个数(该运算实现的前提是两个指针指向同一个空间)
有下面一串代码:

#include<stdio.h>
int main()
{
int arr[9]={1,2,3,4,5,6,7,8,9};//定义一个整形数组;
int sz=sizeof(arr)/sizeof(arr[0]);//计算数组元素个数;
int *p=&arr[0];//定义一个整形指针变量并初始化;
int *q=&arr[sz-1];
printf("%d",q-p);
return 0;
}

打印输出的结果为8,也就是p与q之前有8个元素,我们再用图示来解释:
在这里插入图片描述
p中存储的是arr[0]的地址,q存储的是arr[8]的地址,所以指针q-指针p之间的元素个数为8.

3.指针间的关系运算

指针间的关系运算其实就是指针间的大小比较,我们定义一个数组,随着下标的增长,地址是由低到高的,那么下面我们通过进行指针的大小比较来将数组元素的值增加1并将其输出打印:

#include<stdio.h>
int main()
{
int arr[9]={1,2,3,4,5,6,7,8,9};//定义一个整形数组并将其初始化
int sz=sizeof(arr)/sizeof(arr[0]);//计算数组元素个数
int *p=&arr;//定义一个整形指针并将数组首地址赋值给指针变量p
int *q=&arr[sz-1];//定义一个整形指针并将数组最后一个元素的地址赋值给q	
while(p<=q)//判断p<=q是否为真,为真执行下面语句,为假,跳出while语句
{
(*p)++;//每次将数组的元素值加1
printf("%d ",*p);//每次打印数组的元素
p++;//将p的地址增加四个字节使其存储下一个数组元素的地址
}
return 0;
}

该代码输出打印的结果:
在这里插入图片描述
指针加指针这个操作通常是指两个指针相加,但在某些编程语言和上下文中,并非所有指针都适合直接相加。主要有以下几个原因:
1.不同类型: 如果指针不是同一种数据类型的地址,比如一个是整数指针,另一个是字符指针,直接相加就没有意义了,因为它们代表的内存位置和偏移量单位不一样。
2。空指针处理: 空指针(NULL或nullptr)没有实际的地址,当你试图对空指针加值时,会引发运行时错误,因为这种操作试图访问无效的内存地址。
3.指针指向的数据结构: 对于复杂数据结构如数组、字符串等,内部元素的地址可能是连续的,但是相邻元素之间的指针相加可能并不表示有效的元素间跳跃,除非明确知道数据结构的具体规则。
4.未初始化指针: 直接对未初始化的指针进行加法运算可能导致不可预知的结果,因为它们尚未指向任何有效的内存地址。
5.特定库的操作限制: 一些高级编程语言或库可能会有特定的指针处理机制,不允许或者限制普通指针间的简单相加。因此,在设计程序时,需要根据具体情况判断是否可以安全地对指针进行加法操作,或者使用指针算术运算符来处理

标签:arr,运算,int,元素,C语言,地址,数组,指针
From: https://blog.csdn.net/2403_82366393/article/details/143125348

相关文章

  • 刷题总结——滑动窗口与双指针
    总结问题类型滑动窗口(同向双指针)定长不定长求最长/最大求最短/最小求子数组个数单序列双指针(同向/相向)同向:快排求partition的Lobos算法相向:三数之和(保证有序)注意去重双序列双指针双指针子序列判断多指针荷兰旗lowmidhigh00n初始化直到mid与high......
  • C语言的 main 函数具体作用是什么
    C语言的mAIn函数具体作用有:1.程序的起点和入口;2.程序的执行流程;3.接收命令行参数;4.程序的结束点;5.操作系统与程序的接口;6.提供程序的整体结构。main函数是C程序的起点和入口。当程序开始执行时,操作系统会首先寻找并调用main函数。1.程序的起点和入口main函数是C程序......
  • C语言顺序表基本操作
    线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常⻅的线性表:顺序表、链表、栈、队列。顺序表一般由一个数组构成,每个元素都连续存放。头文件#include<iostream>#include<stdio.h>#include<stdlib.h>#include<conio.h>#......
  • C语言指针练习
    题目如下:有1个班,3个学生,各学4门课,计算总平均分以及输出第n个学生的成绩示例代码如下:#include<stdio.h>intmain(){voidaverage(float*p,intn);voidsearch(float(*p)[4],intn);floatscore[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};......
  • 在C语言中如何实现字符串反转
    在C语言中,要实现字符串反转,基本的方法有三种:1、使用数组来存储字符串并反向输出;2、使用指针进行反向输出;3、使用递归方法将字符串反向输出。在这里,我们将详细介绍如何使用指针进行反向输出。一、使用指针进行反向输出在适用于字符串反转的许多方法中,使用指针实现字符串反转是......
  • C语言-详细讲解-洛谷P1255 数楼梯
    目录1.题目要求2.题目解读 1.如何计算走法数?2.如何解决大数加法,防止数据溢出1.进位的处理2.正序运算,倒序输出3.寻找结果中最高的非零位3.代码实现1.题目要求2.题目解读 一道非常经典的题目,简洁易懂,但需要一定的数学思维,难点如下:1.如何计算走法数?这里需要我......
  • 【C语言】编译和链接(编译环境和运行环境)
    文章目录一、翻译环境和运行环境二、翻译环境1.编译预处理编译汇编2.链接四、运行环境一、翻译环境和运行环境  在ANSIC的任何⼀种实现中,存在两个不同的环境,如下:翻译环境:在翻译环境中,会通过编译和链接两个大步骤,其中编译又分为了预处理(预编译)、编译和汇......
  • 【C语言】扫雷详解(手把手教你敲扫雷)
    目录前言正文开始1.扫雷游戏的分析与设计1.1扫雷游戏的功能说明1.2游戏的分析和设计1.2.1数据结构的分析1.2.2文件结构设计2.代码实现2.1.1文件game.h2.1.2文件game.c2.1.3文件test.c2.2讲解2.2.1主体2.2.2有关定义2.2.3函数1.InitBoard()初始化棋盘2.SetMin......
  • 如何在C语言中进行数据加密
    ##如何在C语言中进行数据加密在讨论C语言中的数据加密时,我们首先需要明确两个核心观点:使用加密库、实现自定义加密算法。其中,使用加密库是最直接且高效的方式,因为这允许开发者利用已经广泛测试和验证的加密算法来保护数据的安全性,而无需深入了解加密算法的内部工作原理。此外,一......
  • 为什么c语言不支持热更新
    ###为什么C语言不支持热更新在讨论为什么C语言不支持热更新时,我们首先需要明确几个核心观点:C语言的编译性质、内存管理机制、以及与操作系统的底层交互方式。编译性质意味着C语言代码在运行前需要被完全编译成机器码,这个过程中产生的是一个静态的、不可变的执行文件。这与热更......