指针初识总结(下)

简介: 指针初识总结

   2.指针减去指针  

指针减去指针得到的值的绝对值其实是两地址中间元素的个数

例如1:

#include<stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  printf("%d", &arr[9] - &arr[0]);    //指针减去指针
}

结果:

image.png

分析:

image.png

例如2:

#include<stdio.h>
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  printf("%d", &arr[0] - &arr[9]);    //指针减去指针
}

结果:

image.png

注意:指针减指针时,这两个指针必须是指向同一块空间的,比如:同一个数组。

应用

写一个函数模拟strlen函数的功能

#include<stdio.h>
int my_strlen(char* str)
{
  char* start = str;
  char* end = str;
  while (*end != '\0')
  {
    end++;
  }
  return end - start;       //指针减指针
}
int main()
{
  char arr[] = "apple";     //存在数组中的元素为 'a','p','p','l','e','\0'
  int len = my_strlen(arr);
  printf("%d", len);
}

结果:

image.png

    3.指针的关系运算

指针关系运算就是指比大小

1.#include<stdio.h>
#define N 5  //宏
int main()
{
  int arr[N] = { 1,1,1,1,1 };
  int* p;
  for (p = &arr[N]; p > &arr[0];)   //进行指针大小比较
  {
    *--p=0;
  }
  int i = 0;
  for (i = 0; i < N; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

结果:

image.png

分析:

image.png

四. 指针与数组

1.数组名是什么?

#include<stdio.h>
int main()
{
  int arr[5] = { 0 };
  printf("%p\n", arr);   //打印数组名地址
  printf("%p\n", &arr[0]);  //打印数组首元素地址
}

结果:

image.png

由结果看出,两个地址相同所以可以得出结论 :数组名绝大多数情况下指的是首元素地址


例外:


1.&arr  ——&数组名 ,数组名不是首元素的地址-此情况下数组名表示整个数组,&数组名 取出的是整个数组的地址


整个数组的地址与首元素的地址数值上相同,但表示的意义完全不同。分析如下:  

image.png2.sizeof(arr)——sizeof(数组名)此情况下数组名表示整个数组,sizeof(arr)计算的是整个数组的大小。

数字组可通过指针来访问

指针访问的是数组首元素地址

#include<stdio.h>
int main()
{
  int i = 0;
  int arr[5] = { 1,2,3,4,5 };
  int* p = &arr;  //访问首元素地址
  for (i = 0; i < 5; i++)
  {
    printf("%d ", *(p + i));
  }
}

结果:

image.png

五. 二级指针

#include<stdio.h>
int main()
{
  int a = 3;
  int* pa = &a;
  int** ppa = &pa;//二级指针存放的是pa的地址,及存放a地址的地址
}

如上面例子,二级指针存放的是pa的地址,及存放a地址的地址

当然也有三级指针,四级指针等

#include<stdio.h>
int main()
{
  int a = 3;
  int* pa = &a;
  int** ppa = &pa;//二级指针存放的是存放pa的地址,及存放a地址的地址
  int*** pppa = &ppa;//三级指针
  int**** ppppa = &pppa;//四级指针
}

后面以此类推。

五.指针数组

指针数组本质是一个数组

是一个存放指针数组

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  int c = 8;
  int* arr[] = { &a,&b,&c };//指针数组,用来存放指针
}
相关文章
|
6月前
|
消息中间件 存储 Kafka
RocketMQ实战—4.消息零丢失的方案
本文分析了用户支付完成后未收到红包的问题,深入探讨了RocketMQ事务消息机制的实现原理及其在确保消息零丢失中的作用。首先,通过全链路分析发现消息可能在推送、存储或消费环节丢失。接着,介绍了RocketMQ事务消息机制如何通过half消息、本地事务执行及回调确认来保证消息发送成功,并详细解析了其底层原理,如half消息对消费者不可见、rollback与commit操作等。同时,对比了同步重试方案,指出其在复杂场景下的局限性。
RocketMQ实战—4.消息零丢失的方案
|
机器学习/深度学习 人工智能 测试技术
探索自动化测试的前沿技术与实践
自动化测试作为提升软件开发效率和质量的关键工具,正经历着前所未有的变革。随着人工智能、机器学习、云计算等技术的融合与创新,自动化测试不断突破传统界限,展现出更智能、更高效、更灵活的发展趋势。本文将深入探讨自动化测试领域的最新技术进展,分析其在现代软件开发中的应用,并讨论如何有效整合这些技术以最大化测试效率和准确性。
|
JavaScript Java 应用服务中间件
一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署(一)
一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署
685 0
|
Linux
Linux入门教程以及基础命令(高级)拿走点赞收藏
Linux入门教程以及基础命令(高级)拿走点赞收藏
93 0
|
机器学习/深度学习 数据可视化
|
安全 Java
单例模式(Singleton Pattern)(三)
上篇文章我们讲述了,单例的推荐使用方式,以及反射对单例的破坏,但文末留了一个疑问,就是序列化如何破坏一个单例,那么本篇文章就来分析一下。
152 2
单例模式(Singleton Pattern)(三)
|
前端开发 JavaScript Java
基于Javaweb 开发的个人博客系统心灵小阁
基于Javaweb 开发的个人博客系统心灵小阁
428 0
基于Javaweb 开发的个人博客系统心灵小阁
|
Java 数据库连接 Maven
Java学习路线-66:Maven
Java学习路线-66:Maven
149 0
|
XML 前端开发 数据格式