指针

智能指针(19)

亡梦爱人 提交于 2019-12-23 02:32:44
# ifndef _A_H_ # define _A_H_ # include <iostream> using namespace std ; class A { public : int a ; int b ; A ( int a ) ; A ( int a , int b ) ; } ; # endif # include "A.h" A :: A ( int a ) { this - > a = a ; cout << "A::A(int a) a = " << this - > a << endl ; } A :: A ( int a , int b ) { this - > a = a ; this - > b = b ; cout << "A::A(int a, int b) a = " << this - > a << " b = " << this - > b << endl ; } # include "A.h" # include <memory> int main ( ) { shared_ptr < A > p1 = make_shared < A > ( 1 ) ; shared_ptr < A > p2 = make_shared < A > ( 2 , 3 ) ; cout << "p1->a = " << p1 - > a << endl ;

19.删除链表的倒数第N个节点

依然范特西╮ 提交于 2019-12-23 01:32:46
题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 解答: 直觉解答: 两次遍历算法:第一遍先遍历整个链表确定链表长度L,第二遍遍历到(L-n)的位置,跳过倒数第n个节点,连接到倒数第n-1个节点,返回头指针。 /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int x) { val = x; } * } */ public class Solution { public ListNode RemoveNthFromEnd(ListNode head, int n) { // 用来保存头节点,如果被删除的节点非头节点,直接返回该节点 ListNode oldhead = head; int length = 0; // 遍历链表以记录链表长度 while(head.next != null) { length++; head = head.next; }

C语言博客作业--字符数组

戏子无情 提交于 2019-12-23 01:00:31
一、PTA实验作业 题目1:7-3 找最长的字符串 1. 本题PTA提交列表(要提交列表,不是结果) 2. 设计思路 { 定义变量i,n,flag,max 输入字符串数n 定义数组 num[n]存放每个字符串长度 定义字符数组 str[n][80] for i=0 to i=n-1 { 输入str[i]; 计算str[i]长度存于num[i]; i++; } max=num[0]; for i=0 to i=n-1 { if num[i]>max{ max重新赋值max=num[i]; 记下最长串所在位置flag=i } } 输出结果 } 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明 本题没有碰到问题 题目2:7-6 Jack cheng的烦恼2 1. 本题PTA提交列表 2. 设计思路 { 定义整形变量i,j,n; 定义字符数组str[5001]; 输入字符个数n; 输入字符串; for i=0 to i=n-1 i++{ if str[i]为')'或'}' 输出False 结束程序return 0; if str[i]=='('{ for j=i+1 to j=n-1 j++{ if str[j]为')'{ 令str[i] str[j]都为空字符 } } } if str[i]=='}'{ for j=i+1 to j=n-1 j++{ if str[j]为'

第12课 - 解析const和指针关系

这一生的挚爱 提交于 2019-12-23 00:37:41
一、C++的const常量的判别准则 (1)只有用字面量初始化的const常量才会进入符号表 (2)被volatile修饰的const常量不会进入符号表 (3)使用其它变量初始化的cosnt常量仍然是只读变量 (4)在编译期间不能直接确定初始值的const标识符,都被作为只读变量处理。 (5)使用相同类型的常量初始化const引用变量,const引用变量只是只读变量,和常量内存地址一样。 (6)使用不同类型的变量初始化const引用变量,const引用变量会成为一个新的只读变量,和初始化变量内存不一样。 上述的第(1)点如图1所示;第(2)、(3)、(4)点如图2所示;第(5)、(6)点如图3所示: 图1 图2 图3 二、引用与指针的关系 指针是一个变量,值为一个内存地址,不需要初始化,可以保存不同的地址;通过指针可以访问对应内存地址中的值;指针可以被const修饰成为常量或者只读变量。 引用只是一个变量的新名字;对引用的操作(赋值、取地址等)都会传递到代表的变量上,const引用使其代表的变量具有只读属性;引用必须在定义时初始化,之后无法代表其它变量。 从使用C++语言的角度看;引用与指针没有任何的关系;引用是变量的新名字,操作引用就是操作对应的变量。 从C++编译器的角度看;为了支持新概念“引用”必须要一个有效的解决方案,在编译器内部,使用指针常量来实现“引用”;因此“引用

如何写出高效的链表代码

谁说胖子不能爱 提交于 2019-12-23 00:26:05
本篇文章将介绍下面这些内容,阅读预计15分钟。 文章目录 链表和数组区别 面试题常考的链表算法 LeetCode练习题索引 总结: 链表和数组区别  我们在问两个事物的区别时,我们实质是在问这两者分别是什么?而非真的关注差别本身。 数组: 数组是一种线性表数据结构。它用 连续的内存空间 ,存储 相同类型的数据 。  数组因为申请内的存是连续的内存空间,所以在知道First Index 的内存地址后,可以立即通过位置的 偏移 计算出其他任何位置(下标)的内存地址。也就是我们常说的随机访问的特性。 例如存储整数的一个Array,每个整数占4字节,在内存中的情况如下: 在知道arr[0]的内存地址是 0x100后,可以通过公式求取任意位置的内存地址: adrr[n] = 100+4*n 因为这个特性,可以利用CPU的高速缓存,在读取数组时,预读取一组数据,加快访问效率。 链表: 链表也是一种线性表数据结构,它通过 指针 把各个 零散 的节点串联起来。  将数组和链表放在一起看,可以发现,链表的内存地址不一定是连续的,系统不会预先分配给链表指定大小的内存空间。当向链表中存放数据,系统会寻找未使用的内存块,存放数据,然后把前一个节点的指针指向该内存。 所以当数组申请一个1G大小的空间时,系统可能因为没有足够的内存空间而创建失败。而链表不存在这样的问题,它使用的是系统中零散的内存。

第四周周报

▼魔方 西西 提交于 2019-12-22 21:38:19
第四周周报 一,上周工作总结 接着学习了指针的相关知识点,但是都是一些基本知识,深入了解还不够, 指针代码不熟练,应该多敲,下周应该好好看视频,加深理解 复习了其他专业课知识, 没有复习前端的知识 二,本周学习收获 C语言学习到了指针,把课本知识全部看完了,但是没有实战,代码部分还需要好好加强 复习了高数,把课本的重要知识点过了一遍,打算下周再看看做过的作业,考过的卷子 工图复习了一小部分,简单图会画,但是比较复杂的就不太会 下面是这周总结的C语言指针部分自己需要好好理解的例题 《一》: 二分查找 例如此题:设已有一个10个元素的整形数组a,且按值从小到大有序排列,输入一个整数x,然后在数组中查找x,如果找到,输出对应下标,否则,输出“Not Found” 《二》: 关于指针自增自减讲解 《三》: pta有关字符串的问题 #include<stdio.h> int main(void) { char str[]= "abc\0def\0ghi", *p=str; printf("%s", p+5) ; return 0; }//str是一个字符串数组 //\0代表一个字符,要注意 //p指向了str的第一个字符,p+5则是指向了第6个字符:也就是'e' //然后printf("%s", p+5)就是从p+5指向的字符开始输出,一直到遇到'\0'为止,所以最后的输出是 :ef

指针和引用的区别

怎甘沉沦 提交于 2019-12-22 12:56:56
一、 C++中引用和指针的区别 指针初始化的时候,可以指向一个地址,也可以为空。 引用必须初始化为另一个变量. int ival = 1024; int *pi = &ival; // a pointer int &rval = ival; // a reference 二、 估计很多人在编写C++程序都或多或少的会用到pointer 和 reference这两种东西,但是他们两者到底有什么样的区别和联系呢,相信大多数人是不太了解的,今天我就两者的区别和联系从实际程序的角度来加以区别。 C/C++中的指针其实就是一个变量,和其他类型的变量是一个样子的,它是一个占用四字节的变量(32位机上),它与其他变量的不同之处就在于它的变量值是一个内存地址,指向内存的另外一个地方。reference我的理解就是一个别名,它和linux操作系统上的alias是一个样子的。再者,一个pointer变量可以指向NULL,表示它不指向任何变量地址,但是reference必须在声明的时候就得和一个已经存在的变量相绑定,而且这种绑定不可改变。下面是我写的一段程序来验证pointer与reference的区别和联系的,希望能对大家理解pointer & reference的区别和联系有所帮助: #include "stdafx.h" #include <iostream> using namespace

C++ 引用

我只是一个虾纸丫 提交于 2019-12-22 12:56:14
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的不同: 不存在空引用。引用必须连接到一块合法的内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。 C++ 中创建引用 试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。 int& r = i; 在这些声明中,& 读作 引用 。 引用通常用于函数参数列表和函数返回值。 C++ 把引用作为参数 实例 #include < iostream > using namespace std ; // 函数声明 void swap ( int & x , int & y ) ; int main ( ) { // 局部变量声明 int a = 100 ; int b = 200 ; cout << " 交换前,a 的值: " << a << endl ; cout << " 交换前,b 的值: " << b << endl ; /* 调用函数来交换值 */ swap ( a , b ) ; cout

两个类头文件互相包含

China☆狼群 提交于 2019-12-22 12:14:37
此文转载自: C++中两个类的头文件互相包含问题 - CSDN博客 http://blog.csdn.net/a812073479/article/details/38542515 我们知道,当一个类(设类A)中包含另一个类(设类B)的对象时,必须在该文件中包含另一个类的头文件,如果两个类都互用到了对方的对象,理论上就要互相包含头文件,但是这样是不可取的。贴出代码如下: 这样是无法通过编译的,其原因是它们的头文件互相包含了,你包含我,我又包含你,没完没了! 为了解决这个问题,只需要去掉一个或则都去掉包含的头文件语句即可,为了要去掉包含的头文件 语句,就不能在类中定义另外一个类的对象,而我们却是要在该类中使用另外一个类的对象,那么 就可以利用对象的指针,而用对象的指针却可以不用包含头文件,做简单的声明即可。这样就打破 了你包含我,我包含你的情况。(当然也可以利用全局对象、类的继承来解决!) 根据情况,可以分为是否使用类的对象:(这里使用类的对象是指将对象当作类的成员) 1、如果在A类中使用了B类的对象,那么就必须包含B类的头文件,而B类中就不能使用A类的对象了, 这时就可以用对象的指针,用对象的指针,可以作简单的声明即可代替头文件的包含。此类情况的 代码如下: 最后应该注意,B类中使用的是指针,所以使用前必须先初始化,让其指向一个存在的对象; 另外,为了通过指针使用A类的成员函数

常指针类型讲解(const int *p,int*const p,int const *p,指针常量,常量指针)

旧街凉风 提交于 2019-12-22 11:53:34
1 、基础类型:const int n : const int n = 20,有了const修饰的n 我们不称它为变量,而称符号常量,代表着20这个数。这就是const 的作用。n不能在其他位置重新赋新值了。 格式写法:const int n = 20;与int const n = 20;它们是完全相同的。const 与int哪个写前都不影响语义。 有了这个概念后,我们来看这两个格式: const int * pi 与 int const * pi ,要记住一点,int 与const 哪个放前哪个放后都是一样的,也就是说,它们也是相同的。 2 、const int * pi 的语义 我先来说说const int * pi是什么作用。看下面的例子: int n1 = 30; int n2 = 40; const int * pi = &n1; pi = &n2; // 注意这里,pi 可以在任意时候重新赋值一个新内存地址 n2 = 80; // 想想看:这里能用*pi = 80; 来代替吗?当然不能 printf( “%d ”, *pi ) ; // 输出是80 语义分析: pi的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi来修改n2的值。这个规则符合我们前面所讲的逻辑吗?当然符合了! 首先const 修饰的是整个*pi(注意,我写的是*pi而不是pi)。所以