指针

C语言刷题(17):用指针变量作为函数参数传值,对输入的两个整数按大小顺序输出

微笑、不失礼 提交于 2020-01-16 05:46:43
# include <stdio.h> void main ( void ) { void swap ( int * a , int * b ) ; int a , b , * p , * q ; p = & a ; q = & b ; printf ( "input a and b:" ) ; scanf ( "%d %d" , & a , & b ) ; if ( * p < * q ) { swap ( p , q ) ; } printf ( "max = %d min = %d" , * p , * q ) ; } void swap ( int * a , int * b ) { int t ; t = * a ; * a = * b ; * b = t ; } 结果: input a and b : 5 66 max = 66 min = 5 来源: CSDN 作者: qq_1316238389 链接: https://blog.csdn.net/qq_38173631/article/details/103994982

AC自动机算法详解

流过昼夜 提交于 2020-01-16 05:09:53
说明转载出处:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 感谢大牛的博客!! 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。 如果你对KMP算法和了解的话,应该知道KMP算法中的next函数(shift函数或者fail函数)是干什么用的。KMP中我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符,当A[i+1]≠B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1..i]与B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配,而next函数恰恰记录了这个j应该调整到的位置。同样AC自动机的失败指针具有同样的功能,也就是说当我们的模式串在Tire上进行匹配时,如果与当前节点的关键字不能继续匹配的时候

第六周作业

跟風遠走 提交于 2020-01-16 04:56:25
这次作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/2889 我在这个课程的目标是 熟练使用指针编程 这个作业在哪个具体方面帮助我实现目标 初步了解了指针变量的一些基本运算,复习了自定义函数 参考文献 https://baike.baidu.com/item/%E6%8C%87%E9%92%88/2878304?fr=aladdin 一、本周完成的作业 基础作业 题目1.求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double *a, double *b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: #include<stdio.h> #include <math.h> double fun (double *a, double *b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n"

C语言函数指针

我的梦境 提交于 2020-01-16 02:27:41
原理: 1、对于一个函数来说,他的函数名是函数的地址,一个指向函数代码的指针,是函数的入口地址,调用地址。 2、函数指针是一个指向函数的指针(获得函数名),函数指针指向函数名就可以替代该函数执行,去调用该函数 使用方法: 1,声明一个函数指针,统一接口(函数返回值类型和函数参数类型):返回值类型 ( 函数指针名)(参数列表) 函数指针名首先与 结合表明是指针,之后与()结合表明是指向函数的指针 2,指针指向要执行的函数地址(函数名) 3,用函数指针替代函数名执行该函数 代码 # include <stdio.h> # include <stdlib.h> typedef int ( * pfunc ) ( int , int ) ; //该函数指针的别名为pfunc,统一接口 int getMax ( int a , int b ) { return a > b ? a : b ; } int getMin ( int a , int b ) { return a < b ? a : b ; } void test01 ( ) { printf ( "getMax = %p, getMin = %p\n" , getMax , getMin ) ; //打印函数入口地址 } void test02 ( ) { int res = 0 ; pfunc p = NULL ; /

指针学习笔记-1

喜欢而已 提交于 2020-01-16 01:23:00
文章目录 指向地址的指针 指针本身的大小 指向数组的指针 指针数组 指向指针数组的指针 多维指针数组 函数参数中使用指针 数组指针传址实现数组求和 函数指针 模仿C++ 类别 没有例子不说话 指向地址的指针 指针本身的大小 指向数组的指针 指针数组 指向指针数组的指针 多维指针数组 函数参数中使用指针 # include <stdio.h> int myswap ( int * a , int * b ) { int temp = * a ; * a = * b ; * b = temp ; } int main ( ) { int x = 50 ; int y = 30 ; myswap ( & x , & y ) ; printf ( "x:%d y:%d\n" , x , y ) ; return 0 ; } // x:30 y:50 // 这个程序看似简单, 但是却应用到了而很多高级的算法, // 指针 引用 当初不理解,现在终于理解了! 数组指针传址实现数组求和 # include <iostream> using namespace std ; int mysum ( int length , int * data ) { int myresult = 0 ; int i ; for ( i = 0 ; i < length ; i ++ ) { myresult +

栈和队列总结

核能气质少年 提交于 2020-01-16 01:06:23
栈和队列都来自 线性表数据结构 ,都是 “操作受限”的线性表 栈 1.定义 : 是限制在表的一端进行插入和删除操作的线性表。 后进先出 LIFO 线性表 2. 注意点 : 栈顶 (Top) :允许进行插入、删除操作的一端,又称为 表尾 。用栈顶指针 (top) 来指示栈顶元素。 栈底 (Base) :是固定端,又称为 表头 栈 ——顺序存储 定义 : 栈的顺序存储结构,用 一维数组来存储栈 。根据数组是否可以根据需要增大,又可分为 静态顺序栈 和 动态顺序栈 。 栈 ——动态顺序存储 1. 注意点 : ◆ 用 top=bottom 作为 栈空的标记 ◆ 结点进栈时,首先将数据元素保存到栈顶 (top 所指的当前位置 ) ,然后执行 top 加 1 ,使 top 指向栈顶的下一个存储位置 ◆ 结点出栈时, 首先执行 top 减 1 ,使 top 指向栈顶元素的存储位置,然后将栈顶元素取出 ◆ 若栈的数组有 Maxsize 个元素,则 top=Maxsize 时 栈满 2. 结构体定义 : typedef struct SqStack { ElemType *bottom; /* 栈不存在时值为NULL */ ElemType *top; /* 栈顶指针 */ int stacksize ; /* 当前已分配空间,以元素为单位 */ }SqStack; 3. 追加存储空间操作 : //

c++:智能指针(weak_ptr)

房东的猫 提交于 2020-01-16 00:54:14
1.weak_ptr到底是什么? 简单的说就是weak_ptr是shared_ptr的一个助手,是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。不论是否有weak_ptr指向,一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。 2.为什么需要weak_ptr? 多个shared_ptr实例可以指向同一个动态对象,并维护了一个共享的引用计数器。对于引用计数法实现的计数,总是避免不了循环引用(或环形引用)的问题,这个时刻就需要智能指针 weak_ptr 例子: #include <iostream> #include <memory> #include <vector> using namespace std; class ClassA { public: ClassA() { cout << "ClassA Constructor..." << endl; } ~ClassA() { cout << "ClassA Destructor..." << endl; } shared_ptr<ClassB> pb; // 在A中引用B }; class ClassB { public: ClassB()

带你重新认识指针(下)

谁说胖子不能爱 提交于 2020-01-16 00:54:10
目录 真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血。这是怎样的哀痛者和幸福者?然而造化又常常为庸人设计,以时间的流驶,来洗涤旧迹,仅使留下淡红的血色和微漠的悲哀。在这淡红的血色和微漠的悲哀中,又给人暂得偷生,维持着这似人非人的世界。我不知道这样的世界何时是一个尽头!我们还在这样的世上活着;我也早觉得有写一点东西的必要了。 ——鲁迅 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!!   看完我上一篇指针的讲解之后很多同学反馈很不错,有网友给私信说之前在大学里面一直搞不懂指针的问题,说到指针都是云里雾里,老师讲的也是很难听懂 , 点击即可进入 指针(上) 。也有很多网友表示非常期待指针下的文章,所以我就马不停蹄的继续写 ,下 主要讲解指针的特性以及指针安全问题。 指针的特性 指针和常量  先说下什么是常量,常量就是不可变的量,一旦定义该常量,其值在整个程序生命周期都是不可变的,常量存放在虚拟地址空间的常量区。  在C语言里面有两种定义常量的方法。 使用const关键字 , const 定义的是变量不是常量,只是这个变量的值不允许改变是常变量,带有类型。编译运行的时候起作用存在类型检查。 使用#define预处理器, define 定义的是不带类型的常数

C语言刷题(17):指针篇,使用指针实现数组逆置

家住魔仙堡 提交于 2020-01-16 00:51:28
# include <stdio.h> void main ( ) { void reverse ( int * a , int n ) ; int * p ; int a [ 10 ] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ; reverse ( a , 10 ) ; for ( p = a ; p < a + 10 ; p ++ ) { printf ( "%d " , * p ) ; } } void reverse ( int * a , int n ) { int i , j , t ; for ( i = 0 ; i < n / 2 ; i ++ ) { t = * ( a + i ) ; * ( a + i ) = * ( a + 9 - i ) ; * ( a + 9 - i ) = t ; } } 结果: 9 8 7 6 5 4 3 2 1 0 来源: CSDN 作者: qq_1316238389 链接: https://blog.csdn.net/qq_38173631/article/details/103995447

c++如何区分顶层const和底层const

这一生的挚爱 提交于 2020-01-15 23:59:34
https://blog.csdn.net/qq_19528953/article/details/50922303 指针实际定义了两个对象,指针本身和它所指的对象。这两个对象都可以用const进行限定 当指针本身被限定时,称指针为顶层const; 当指针所指的对象被限定为常量时,而指针本身未被限定,称指针为底层const 声明时const可以放在类型名前后都行,const int和int const 是等价的。 1.声明指向常量的指针也就是底层const int a = 1; const int *pa = &a;//底层const *pa = 2 是错误的因为底层const是限定了指针所指的对象,你不能改变对象的内容 指针pa指向的内容不是常量,可以通过赋值语句 a = 2是可以的 2.指针常量 代表指针本身,定义时必须初始化,它存储的地址值就不能再改变。声明时const必须放在指针符号*后面 如*const 1 int a = 1; 2 int b = 2; 3 *const int pa = &a;//顶层指针 4 pa = &b;是错误的,常量指针不能改变存储的地址值 那么区分这两个的作用是什么? 1 执行对象拷贝时有限制,常量的底层const不能赋值给非常量的底层const。也就是说,你只要能正确区分顶层const和底层const,你就能避免这样的赋值错误 1 int