IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 一级指针和一维数组的关系(深度解析) -> 正文阅读

[数据结构与算法]一级指针和一维数组的关系(深度解析)


前言

今天看到一个C语言程序题的时候,觉得有的时候我们即使把答案写出来了,但是过程具体是怎么实现的可能并不太清楚,所以我这里会将这道程序题讲的比较清楚一点,希望对指针困惑的同学能理解。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数组名是什么?

数组名其实是数组的首地址,假设 char a[]=“3e434”;这里的a本质上就相当于是&a[0]。为什么会这样?原因很简单:大多数用到数组名的地方,编译器会将数组名变成指向数组的首元素的指针。
由于这篇文章并不是解释数组名的,如果还没搞懂,大家可以参考一个这个链接:数组名和指针的关系

二、程序解析

1.程序如下

/**
 * @file point.c
 * @author Zheng Hao (2278757316@qq.com)
 * @brief 一级指针和一维数组的关系
 * @version 0.1
 * @date 2022-03-08
 *
 * @copyright Copyright (c) 2022
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fun(char *w, int n);
int main()
{
  char *p = "1234567";
  fun(p, strlen(p));
  puts(p);
  system("pause");
  return 0;
}
void fun(char *w, int n)
{
  char *s1 = w, *s2 = w + n - 1;
  while (s1 < s2)
  {
    /* code */
    char t;
    t = *s1++;
    *s1 = *s2--;
    *s2 = t;
  }
}

2.分析代码

如果对数组名不太熟悉的话,可能会读不懂第一行代码。
char *p = "1234567";
其实是相当于:下面的两行代码,指的其实是指针变量p指向a[0]。

char a[] = "1234567";
char *p = a;

这里简单的提示一下:fun(p, strlen(p));这行代码中的strlen的长度是7不是8,因为其不会算上\0字符,与操作运算符sizeof的结果不一样。

下面我们来简单的读一下我们定义的函数fun中的代码

//这里的指针变量s1相当于&a[0],s2相当于&a[6]
  char *s1 = w, *s2 = w + n - 1;

不知道大家对于这个while语句中的s1和s2是否有些疑问?

while (s1 < s2)
  {
    /* code */
    char t;
    //*s1++相当于*(s1++),这个意思相当于将地址+1
    t = *s1++;
    *s1 = *s2--;
    *s2 = t;
  }

这里的s1和s2其实是地址值,由于数组在内存中是线性存储的,s1本质上是a[0]的地址,s2是a[6] 的地址。
在这里插入图片描述
细心的会发现,为什么这里s1的地址值调试出来,旁边会有一个字符串?
其实原因很简单,这里我写了几句简单的代码来帮助理解。本质上: C语言在处理这种字符串时候,默认当成了常量字符串,即const类型。在这里插入图片描述
继续来分析我们的程序:

//*s1++相当于*(s1++),这个意思相当于将地址+1
    t = *s1++;
    *s1 = *s2--;
    *s2 = t;

这里的t=*s1++需要注意一下,相当于我们书上的i++的问题,它是先赋值再自增,所以t=*s++于t=*s是等价的。s1相当于解引用,将a[0]的值赋给t,然后执行s1=s+1,即将a[6]的值赋给a[1],最后再将t的值赋给s2=*s2-1,即a[5]的值。然后后面一直这样循环,直到不满足条件。最终的答案是1711717

总结

这道题目中其实串联了很多小的知识点,有一个小知识点理解错误,可能答案就会出不来。
指针可以直接指向地址然后对其地址上的值进行修改。在某些时候会给程序的效率带来质的飞跃,但使用指针时一定要清楚,指针指向了哪里,考虑会不会给数组中的其他值带来印象,防止会有意想不到的结果出现。


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:50:47  更:2022-03-10 22:55:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:34:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码