当前位置: 首页 > news >正文

【C语言必经之路——第11节】初阶指针(2)

五、指针的运算

1、指针与整数相加减

看一下下面的代码:

#include<stdio.h>
int my_strlen(char* str)
{int count=0;while(*str!='\0'){count++;str++;//指针加减整数}return count;
}
int main()
{int len=my_strlen("abcdef");printf("%d\n",len);return 0;
}

指针加减整数的时候就要看看这个指针式什么类型的指针,就决定着该指针所跨过的字节数,比如上免得代码,str为char*类型的指针,当运行一次str++时,就会往后走一个字节,str就指向了下一个字符。所以指针与整数相加减就是将指针在“字节”上运动,跨的步子大小就是指针类型所决定啦。

2、指针-指针(地址-地址)

(1)、条件

  • 指针都是指向同一块区间的

  • 指针的类型是一致的

总结一下:指针减指针是指针之间元素的个数

//strlen的模拟实现
#include<stdio.h>
int my_strlen(char* str)
{char* start=str;while(*str!='\0'){str++;//指针加减整数}return str-start;//这里经过两个指针相减,可以得到两个指针所指地址之间的元素个数
}
int main()
{int len=my_strlen("abcdef");printf("%d\n",len);return 0;
}

3、指针的关系运算

下面是一个for循环遍历values数组的一个例子

//方法一
for(vp = &values[N_VALUES]; vp > &values[0];)
{*--vp = 0;
}
//改进版本
for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{*vp = 0;
}

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证

它可行。

标准规定:

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与

指向第一个元素之前的那个内存位置的指针进行比较。

六、指针和数组

这里不得不提一下数组名这么一个东西,他呢不只是单单一个名字这么简单,他其实是首元素的地址,换句话说,一个指针如果指向数组首元素,那么几乎可以说这个指针喝这个数组名是等价的。注意,这里说的是几乎,因为数组名在下面两个情况是不能用首地址这么简单的来理解

1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
组。
2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

除去上面两种情况,既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。

例子:

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

所以 p+i 其实计算的是数组 arr 下标为i的地址。

七、二级指针

​​​​​​​二级​​​​​​​指针是指向一级指针,一级指针的值是变量的地址,二级指针的值是一级指针的地址

#include<stdio.h>
int main()
{int a=10;//a在内存空间申请4个字节//一级指针int* pa=&a;//0x0012ff40,pa是指针变量,用来存放a地址,也得向内存申请4/8字节//二级指针int** ppa=&pa;//0x0012ff48,ppa是指针变量,用来存放pa地址,也得向内存申请4/8字节return 0;
}

八、指针数组

指针数组是存放指针的数组

#include<stdio.h>
int main()
{int a=1;int b=2;int c=3;int* arr[]={&a,&b,&c};//arr就是指针数组,分别a,b,c的地址给arr[0],arr[1],arr[2]for(int i=0;i<3;i++){printf("%d ",*arr[i]);}return 0;
}

用指针数组模拟二维数组

#include<stdio.h>
int main()
{int a[]={1,2,3};int b[]={3,4,5};int c[]={5,6,7};int* arr[]={a,b,c};for(int i=0;i<3;i++){for(int j=0;j<3;j++){printf("%d",arr[i][j]);//模拟二维数组,和二位数组还是有差距//printf("%d",*(*(arr+i)+j));}printf("\n");}return 0;
}

今天的分享就到这啦😉


如果我的文章对您有帮助,

“点赞” “收藏” “关注” 一键三连哦!

想了解更多知识请前往故里♡927的博客

如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。


我们下期见😉~~

http://www.lryc.cn/news/4650.html

相关文章:

  • SpringBoot学习(1)第一个SpringBoot程序
  • 什么是热迁移?90%的企业都理解错误
  • Scratch少儿编程案例-丝滑版贪吃蛇
  • Linux系统之网卡子接口配置方法
  • 2023上半年软考中级系统集成项目管理工程师2月25日开班
  • YOLO-V5轻松上手
  • CSS的优先级理解
  • 前端工程师leetcode算法面试必备-二分搜索算法(中)
  • 【数据库】MySQL 单表查询,多表查询
  • 【c++】vector实现(源码剖析+手画图解)
  • VScode查看python f.write()的文件乱码
  • excel应用技巧:如何用函数制作简易抽奖动图
  • CSI Tool 安装及配置记录
  • 华为OD机试 - 最低位排序(Python)| 真题+思路+代码
  • C#开发的OpenRA使用TrimExcess方法
  • ImageMagick任意文件读取漏洞(CVE-2022-44268)
  • 第十九篇 ResNet——论文翻译
  • RiProRiProV2主题美化顶部增加一行导航header导航通知
  • RT-Thread MSH_CMD_EXPORT分析
  • 电脑麦克风没声音怎么办?这3招就可以解决!
  • 【C++】运算符重载
  • 什么是眼图?(扫盲向)
  • 【C++】类与对象(二)
  • 【软考】系统集成项目管理工程师(二十一)项目收尾管理
  • 关于公钥与私钥的一点看法
  • 深入React源码揭开渲染更新流程的面纱
  • 32个关于FPGA的学习网站
  • 5分钟快速上手Promise使用
  • 大客户市场:阿里云、腾讯云、华为云“贴身肉搏”
  • 华为OD机试 - 求字符串中所有整数的最小和(Python)| 真题+思路+代码