C语言指针+-整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组

server/2024/9/22 15:48:43/

文章目录

  • 前言
  • 一、指针 +- 整数
  • 二、指针 - 指针
  • 三、指针的关系运算
  • 四、指针和数组
  • 五、二级指针
  • 六、指针数组
    • 指针数组可以将几个一维数组模拟成二维数组
  • 总结


前言

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); // 6return 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); // 6return 0;
}
-------------------------------------------------------------------------------------
// 3. 递归求字符串长度
int my_strlen(char* p)
{if (*p == '\0')return 0;elsereturn 1 + my_strlen(p + 1);
}
int main()
{int num = my_strlen("abcdef");printf("%d", num); // 6return 0;
}
  • 指针加指针一般没有意义
  • 比如:
  • 日期加天数 -----有意义
  • 日期减天数 -----有意义
  • 日期减日期 -----有意义
  • 日期加日期 -----无意义

三、指针的关系运算

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


http://www.ppmy.cn/server/11395.html

相关文章

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

09_FreeRTOS任务通知

任务通知 任务通知常用任务通知API函数 任务通知 FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能&#xff0c;每个任务都有一个 32 位的通知值&#xff0c;在大多数情况下&#xff0c;任务通知可以替代二值信号量、计数信号量、事件组&#xff0c;也可以替代长度为 1 的队列…

代码随想录算法训练营第四十六天|139.单词拆分、背包问题总结

代码随想录算法训练营第四十六天|139.单词拆分、背包问题总结 139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 **注意&#xff1a;**不要求字典中出现的单词全部都使用&#xff0c;并且…

【单元测试】Junit 4--junit4 内置Rule

1.0 Rules ​ Rules允许非常灵活地添加或重新定义一个测试类中每个测试方法的行为。测试人员可以重复使用或扩展下面提供的Rules之一&#xff0c;或编写自己的Rules。 1.1 TestName ​ TestName Rule使当前的测试名称在测试方法中可用。用于在测试执行过程中获取测试方法名称…

数据结构面试常见问题

在IT行业&#xff0c;特别是软件开发和算法工程师的面试中&#xff0c;数据结构知识是必不可少的一部分。面试官通过提问数据结构相关问题&#xff0c;可以评估候选人的编程基础、逻辑思维和解决问题的能力。本文将对数据结构面试中常见的问题进行详细解析&#xff0c;并给出相…

树和二叉树(一)

一、树 非线性数据结构&#xff0c;在实际场景中&#xff0c;存在一对多&#xff0c;多对多的情况。 树( tree&#xff09;是n (n>0&#xff09;个节点的有限集。当n0时&#xff0c;称为空树。 在任意一个非空树中&#xff0c;有如下特点。 1.有且仅有一个特定的称为根的节点…

Python全栈开发前端与后端的完美融合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代&#xff0c;全栈开发已经成为了一种趋势。全栈开发者具备前端和后端开发的…

51.函数嵌套和链式访问

一.函数嵌套 在一个函数中调用另外一个函数叫做函数嵌套。举例&#xff1a; #include <stdio.h>int max(int,int); int min(int,int); int max_or_min(int,int,int);void main(void) {int ret;ret max_or_min(1,1,2);printf("ret is %d\n",ret); }int max(in…