C语言 第五章 指针(3)

embedded/2025/3/20 7:25:05/

目录

指针常用运算

 定义:

指针与整数值的加减运算

格式:

举例:

说明:

实例 

举例:

实例

指针的自增、自减运算 

定义

 实例1:

实例2:


 

指针常用运算


 定义:

          指针本质上就是一个无符号整数代表了内存地址

          除了上面提到的取址、取值外,指针还可以与整数加减、自增自减、同类指针相减运算等。            但是规则并不是整数运算的规则。


指针与整数值的加减运算


格式:

        指针±整数
 
注:

  1. 指针与整数值的加减运算,表示指针所指向的内存地址的移动(加,向后移动;减,向前移动)。
  2. 指针移动的单位,与指针指向的数据类型有关。数据类型占据多少个字节,每单位就移动多少个字节。通过此操作,可以快速定位你要的地址。

举例:

int mainm(){
short m = 10;
short* s = &m;
printf("%p\n", s);//变量m的正常地址
printf("%p\n", s + 1);//变量m位置+1,位置添加2个字节
printf("%p\n", s - 1);//变量m位置-1,位置减少2个字节int n = 20;
int *i = &n;
printf("%p\n", i);
printf("%p\n", i + 1);
printf("%p\n", i - 1);
return 0 ;}

说明:

  • s + 1表示指针向内存地址的移动一个单位,而一个单位的short类型占据两个字节的宽度,所以相当于移动两个字节。

变量a、b、c、d、e都是整型数据int类型,它们在内存中占据一块连续的存储区域。指针变量p指向变量a,也就是p的值是0xFF12,则:

 
说明:

指针p+1并不是地址+1,而是指针p指向下一个数据。比如,int* p,p+1表示当前地址+4,指向下一个整型数据。

实例 

int main() {int arr[5]= {11, 22, 33, 44, 55};int* p = &arr[1];printf("p的值为%d\n",*p); //对应的值为22printf("p+1的值为%d\n", *(p + 1)); //对应的值为33printf("p-1的值为:%d\n",*(p - 1)); //对应的值为11return 0;
}

注意:只有指向连续的同类型数据区域,指针加、减整数才有实际意义。


举例:

对于长度是N的一维数组a,当使用指针p指向其首元素后,即可通过指针p访问数组的各个元素。

 
其中:

  • a[0]用*p表示
  • a[1]用*(p+1)表示
  •  a[i]用*(p+i)表示

实例

#include "stdio.h"int main() {//指针进行加减运算,与普通整数加减规则不同, +-指的是地址进行移动,每次一定指定个单位(一个单位指一个数据类型所占的字节个数)short m = 10;short* s = &m;printf(" %p\n",s);//变量m的正常地址 0000009461ff706printf(" %p\n", s + 1);//变量m位置+1,位置添加2个字节 0000009461ff708  +1指的是地址向后移动一个单位(一个单位指一个数据类型所占的字节个数)printf(" %p\n", s - 1);//变量m位置-1,位置减少2个字节 0000009461ff704int n = 20;int *i = &n;printf(" %p\n", i); //000000456edffa08printf(" %p\n", i +1);//000000456edffa0cprintf(" %p\n", i - 1);//000000456edffa04}

指针的自增、自减运算 


定义

指针类型变量也可以进行自增或自减运算,如下: 
   p++、p--、++p、--p
  
:++和--,这里针对指针的增加或减少指的是内存地址的向前或向后移动。
 
对于数组来说,由于数组在内存中是连续分布的:

  • 当对指针进行++时,指针会按照它指向的数据类型字节数大小增加,比如int*指针,每++一次,就增加4个字节。
  • 当对指针进行--时,指针会按照它指向的数据类型字节数大小减少,比如int*指针,每--一次,就减少4个字节。

 实例1:

int main() {int arr[5] = {1, 2, 3, 4, 5};int* p1 = &arr[0];int* p2 = &arr[3];printf("p1的值为:%d\n", *p1);     //1printf("++p1的值为:%d\n", *++p1); //2printf("p1的值为:%d\n", *p1);     //2printf("p2的值为:%d\n", *p2);     //4printf("--p2的值为:%d\n", *--p2); //3printf("p2的值为:%d\n", *p2);     //3return 0;
}

实例2:

请分析下面几种情况。
初始情况:

int a[5] = {10,20,30,40,50};

情况1

 int* p = a;  //p开始时指向数组a的首元素  等同于 int* p = &a[0];p++;  //使p指向下一元素a[1]printf("%d\n",*p);  //得到下一个元素a[1]的值,即20

情况2:

int* p = a;  //p开始时指向数组a的首元素
printf("%d\n",*p++); //10
printf("%d\n",*p);   //20

 

 


http://www.ppmy.cn/embedded/174077.html

相关文章

免费看付费电影网站制作,高清电影集合搜索引擎网站

引言 在当今数字化时代,电影已经成为人们日常生活中不可或缺的一部分。然而,随着各大视频平台推出付费会员制度,许多用户开始寻找免费观看付费电影的途径。本文将详细介绍如何制作一个免费看付费电影的网站,并打造一个高清电影集…

东隆科技携手PRIMES成立中国校准实验室,开启激光诊断高精度新时代

3月12日,上海慕尼黑光博会期间,东隆科技正式宣布与德国PRIMES共同成立“中国校准实验室”。这一重要合作标志着东隆科技在本地化服务领域的优势与PRIMES在激光光束诊断领域的顶尖技术深度融合,旨在为中国客户提供更快速、更高精度的服务以及本…

python:music21 与 AI 结合应用探讨

Python 的 music21 库与人工智能(AI)技术结合应用具有广泛的可能性,尤其是在音乐生成、分析和风格模拟等领域。以下是具体的结合方向与示例: 1. 音乐生成与 AI AI 模型驱动音乐生成: 使用深度学习模型(如 …

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近,国产AI大模型Deepseek成了网红爆款,大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

C++ 语法之函数和函数指针

在上一章中 C 语法之 指针的一些应用说明-CSDN博客 我们了解了指针变量&#xff0c;int *p;取变量a的地址这些。 那么函数同样也有个地址&#xff0c;直接输出函数名就可以得到地址&#xff0c;如下&#xff1a; #include<iostream> using namespace std; void fun() …

单片机自学总结

自从工作以来&#xff0c;一直努力耕耘单片机&#xff0c;至今&#xff0c;颇有收获。从51单片机&#xff0c;PIC单片机&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;几乎天天在搞:51单片机&#xff0c;STM8S207单片机&#xff0c;PY32F003单片机&#xff0c;…

同为科技智能PDU保障智驾数据处理快速稳定响应

在车联网时代&#xff0c;自动驾驶已经改变了我们生活和出行方式。一辆自动驾驶汽车&#xff0c;配置激光雷达、毫米波雷达、摄像头等传感器&#xff0c;它们在智驾中每时每刻都在进行数据收集。一辆自动驾驶汽车每天产生的数据量可达10TB甚至更多。如此庞大数据量出现&#xf…

BGP 路由选路、负载分担与发布策略

引言 在前面我们已经对BGP有了一个基础的了解&#xff0c;今天咋们就来继续聊聊BGP选路原则 1、13 条选路规则全解析 1、首先丢弃下一跳&#xff08;NEXT_HOP&#xff09;不可达的路由&#xff1b; 2、优选Preferred-value值最大的路由&#xff1b;默认为0&#xff1b; Pref…