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++知识库 -> 【C语言】二级指针的深度理解,峰值的寻找(每日小细节004) -> 正文阅读

[C++知识库]【C语言】二级指针的深度理解,峰值的寻找(每日小细节004)

前言:

欢迎打开这篇博客,从今天开始,每天和大家分享一个C语言小细节,不久之后还会追加C++

一些常常被忽视的小细节和思想统一的编程题目是这个专栏的核心哦

虽然简单但千万别在细节处失分!!!!

每日花一两分钟浏览一下加深一个知识点不香吗?

目录

1.二级指针

2.峰值?


1.二级指针

我们都知道指针变量是保存变量地址的

int main()
{
char a='a';
char* p1=&a;
}

?这里的p1就是一个指针变量(一级指针)因为前面只有一个 * 啊

?

事实上我们口头说的p1就是个“指针”其实我们暗指的就是指针变量

真正的指针就是地址,而指针是存放指针(地址)的变量

就好比我们说10是整型,但是int a=10;a就是把整型变量,里面存放的是整型数据10

既然是一个变量就有自己的地址,类型,空间

指针变量当然不例外

比如指针变量p1的地址是分配好的,仅从上面的代码我们看不出来

类型很显然就是char *,char是指 指针指向的数据类型,就是a的类型(char),*是指p是一个指针

空间内保存的就是a的地址

那么

int main()
{
char a='a';
char* p1=&a;
char** p2=&p1;
}

p2就是二级指针变量

地址依然无法直接看出来

类型是char** 因为p2指向的? p1? 类型是char*,而另一个*代表p2是指针

空间就是p1的地址?

?

?所以对p2一次解引用就指向p1

对p1一次解引用(只能解引用一次)是a的地址,就是指向a

对p2再次解引用,即对p1解引用,找到的还是a

更加相信的指针内容请看

https://blog.csdn.net/weixin_71138261/article/details/126287297?spm=1001.2014.3001.5501

现在看看这个题目吧

找出1 2 3 4 哪几处有程序错误??

首先1就有错误

应该是p==NULL或者num<=0 成立一个就return

void类型的函数里面return就和循环里面的break一样

所以不是&&而是||? 1错误

此外&str不对,str本来就是指针变量,我们是把字符放在str指向的空间里,而不是把str保存的空间(一个地址)改变

所以直接写str就可以? ?3错误

注:在函数返回之后没有释放内存,但是这不会导致程序错误,只会导致内存泄漏。此题选程序错误所以不算

?


2.峰值

我们发现这个题好简单啊,只要从第二个元素开始遍历,这个元素比旁边两个都大就可以了

但是这样是片面的

如果是1 2 3 4 5峰值不在2~4!!!

9? 8? 7? 6? 5? 峰值同样不在内部

所以不要看他给的例子画的图,就是故意诱惑你,写出一般情况

解决问题有两个手段 :

1.先写一般情况,发现有错,把特殊情况穷举出来?

2.直接在“莽夫自杀式”做题之前把各种情况大概思考到位,再动手

先看第一个方法

首先如果数组长度是0,没有元素直接返回0就可(把索引值设为0,最后返回索引)

然后写出else的代码,发现报错,因为只有两个数字根本不能按照

nums[i] > nums[i - 1] && nums[i] > nums[i + 1]

这样比较

所以又补充出else if,当只有两个元素,直接返回最大值(把索引设为在最大数的下标)

最后最后又没过,因为

如果是1 2 3 4 5峰值不在2~4!!!

9? 8? 7? 6? 5? 峰值同样不在内部

这些情况没考虑

所以在最后加上,如果是顺序/逆序,直接把索引设置为长度-1

int findPeakElement(int* nums, int numsLen) {
    // write code here
    int index = 0;
    if (numsLen == 1) index = 0;
    else if (numsLen == 2)
    {
        if (nums[0] > nums[1]) index = 0;
        else
            index = 1;
    }
    else {
        for (int i = 1; i < numsLen - 1; i++)
        {
            if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
            {
                index = i;
            }
        }
        if (index == 0 && nums[0] < nums[1])
            index = numsLen - 1;
    }
    return index;
}

显然这样打补丁很麻烦,万一特例很多这样根本不行

方法二,观察发现,峰值不一定是在内部,很可能在边界
这就对应上一种方法的所有特殊情况
完全可以把第一个元素作为峰值,然后不断比较改变峰值

int findPeakElement(int* nums, int numsLen) {
	int index = 0;//定义索引
	int max = 0;
	if (numsLen == 1) index = 0;
	max = nums[0];
	int i = 0;
	for ( i = 1; i < numsLen; i++)
	{
		if (nums[i] > max) {
			index = i;
			max=nums[i];
		}
	}
		return index;
}
int main()
{
	int nums[100000] = { 0 };	int numsLen = 0;
	scanf("%d", &numsLen);
	for (int i = 0; i < numsLen; i++) {
		scanf("%d", &nums[i]);
	}
		int ret = findPeakElement(nums, numsLen);
		printf("%d", ret);
}

创作不易,感谢观看

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 00:51:43  更:2022-09-04 00:53:44 
 
开发: 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/23 13:40:48-

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