指针

1901怀化学院KHJ错题集

假装没事ソ 提交于 2020-01-14 00:50:11
PTA 错题 结构体 1 . 直接访问就是直接利用变量的地址直接进行访问。T 解: (1)直接访问: int a=0; a=a+1; 这种就属于直接访问变量a这个名字就是你给这块内存取的名字,取a的值的时候就是直接从内存中取出值来 (2)间接访问: int a=0; int *p=&a; *p = (*p)+1; 这种就属于间接访问,p变量的这块内存中存的是a的地址,通过p内存中的地址找到这块内存,取出里边的值,就是间接访问 也就是说:有个中转站的就是间接访问 2.语句int *p,q,r; 定义了3个指针变量。 F 需要全部有 ‘ * ’ Int *不是一体的。 3.语句int *p; *p=50;执行时,不会有任何错误。 F 必须要有一个p的指向变量,p只是一个指针。 4.对于定义int a[10],*p=a; 语句p=a+1;和a=a+1;都是合法的。F p=a+1可以,a=a+1不行;p=a+1为a[1]的值。 5.调用strcmp函数比较字符串大小时,通常较长的字符串会较大。 两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。 a<b<c为大小顺序,两个字符串一样返回0,第一个大,返回正整数,第二个大,返回负整数。 6.在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。T 7.下列程序段的输出是____。C

c++构造函数详解

可紊 提交于 2020-01-14 00:04:33
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助。 c++类的构造函数详解 一、 构造函数是干什么的 class Counter { public : // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private : // 数据成员 int m_value; } 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员的初始化工作 eg: Counter c1; 编译系统为对象c1的每个数据成员(m_value)分配内存空间,并调用构造函数Counter( )自动地初始化对象c1的m_value值设置为0 故: 构造函数的作用:初始化对象的数据成员。 二、 构造函数的种类 class Complex { private : double m_real; double m_imag; public : // 无参数构造函数 // 如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做 // 只要你写了一个下面的某一种构造函数,系统就不会再自动生成这样一个默认的构造函数

C++智能指针

杀马特。学长 韩版系。学妹 提交于 2020-01-13 22:10:21
开始接触C++的项目开发,初步了解OSG(OpenSceneGraph)三维渲染引擎。图形学的知识是大二阶段接触的,也有点遗憾后来的毕设没有继续往这方面研究。现在有点像是朝花夕拾,不过也得上了。确实图形学离不开数学,再次接触还是一堆图元,四元数之类的概念问题。可能就因为这些,C++让人觉得难以接触。今天看了一些资料,下次记录一下在OSG封装下构造基本图形。这次主要介绍一下智能指针。 当时N哥做技术培训时候,这个新词感觉很有意思。下面的链接讲的很细 https://www.cnblogs.com/wxquare/p/4759020.html 这里要注意的是在用智能指针定义数组,需要把这个指针存放在堆里面 比如下面的例子 osg::ref_ptr<osg::ShapeDrawable> shape3 = new osg::ShapeDrawable; 目前对于OSG的了解有限,感觉智能指针和引用计数为0时释放内存这两点比较一直贯穿其中。之后的具体理解再进行补充 来源: CSDN 作者: OPMR 链接: https://blog.csdn.net/sexgeek/article/details/103963062

【JVM】内存管理-HotSpot虚拟机

房东的猫 提交于 2020-01-13 22:09:35
HotSpot虚拟机在Java堆中对象分配。布局和访问的全过程。 对象的创建 在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? 当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 如何划分空间 假设Java堆中内存是 绝对规整 的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为**“指针碰撞” (Bump ThePointer)。但如果Java堆中的内存并 不是规整 的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录

指针详解及常见应用

雨燕双飞 提交于 2020-01-13 17:35:39
指针详解及常见应用 先说下讲解这个专题的原由,这两天一个同事老是跟我抱怨,c的指针太恶心了,指针指来指去的都指懵逼了! 听了他的话,我深深感觉应该把指针好好讲讲。 开始前先大体说下什么是指针,这里说的肯定和大部分玩家说的不一样好好理解下 大部分玩家肯定会说怎么是指针,指针就是 int x=9;int* p=&x; 。但是我想说的是指针本质上就是变量,只不过这个变量比较特别,它存的是内存空间(系统的虚拟内存,不是硬件的物理内存)的地址,当我们去访问时就是去跳转到内存地址去读取存储空间存储的数据。ok!指针就是那么多东西,好了我讲完了! NO! NO! NO! 还有应用呢? 好的我们继续,其实指针大体在使用中可以做分类,我一般按2个角度分.。 本身的性质 :一级指针,二级指针,三级指针等等等等可以无限下去。有人说这个我最烦它了,一级二级的一看就乱,其实在使用中只需要搞清楚,对指针操作到底是操 作的是地址还是存储的实际的值 。这里一级指针我就不多说了一般不会有问题;二级指针例如如果我们创建一个函数,函数体中是malloc一个内存堆空间,malloc的返回值不是作为返回值返回,而是作为函数参数传递给调用者,那么一定需要使用二维指针,因为我们这里是要在实参的地址空间存malloc申请的堆空间的地址。废话不多说看代码: #include <iostream> using namespace

【LeetCode】141-环形链表

为君一笑 提交于 2020-01-13 14:26:20
环形链表 题目 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。 进阶: 你能用 O(1)(即,常量)内存解决此问题吗? 解题思路 这道题目可以用快慢指针解决。 快指针每次走 2 步,慢指针每次走 1 步。如果快指针追上慢指针,则说明链表中存在环(就像 2 个人在操场上跑步,一个跑得快,一个跑得慢,跑得快的那个最终一定会追上慢的那个)。 代码 class Solution { /** * 使用快慢指针,快指针每次走2步,慢指针每次走1步,如果快指针追上了慢指针,则说明存在环 */ public boolean hasCycle ( ListNode head ) { if ( head == null || head . next == null ) { return false ; }

typedef与#define的区别与联系

牧云@^-^@ 提交于 2020-01-13 09:59:23
typedef和#define的用法与区别 一、typedef的用法 在C/C++ 语言 中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以 增强 程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编 译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以 发现 潜在的错误及其它代码维护问题,它的实例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而

结构体嵌套,指针形参,引用传参

坚强是说给别人听的谎言 提交于 2020-01-13 09:56:07
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 6 struct Student 7 { 8 int s_id; 9 string s_name; 10 int s_phonenum; 11 }; 12 13 struct Teacher 14 { 15 int m_id; 16 string m_name; 17 Student m_stu;//班长 18 Student starr[50];//班级学生 19 }; 20 void showinfo1(const Teacher *ter)//指针形参,加了const修饰指针,保证该函数不修改实参的值 21 { 22 cout << "老师姓名: " << ter->m_name << endl; 23 cout << "班级1号学生的电话: " << ter->starr[0].s_phonenum << endl; 24 } 25 26 void showinfo2( Teacher &ter)//引用传参 27 { 28 cout << "老师姓名: " << ter.m_name << endl; 29 cout << "班级1号学生的电话: " << ter.starr[0].s_phonenum << endl; 30 } 31

c++注意点

穿精又带淫゛_ 提交于 2020-01-13 09:50:22
const常量 使用该修饰符定义常量,必须初始化 一旦定义任何地方没法改 如果定义的是一个整型常量,关键字 int 可以省略 const常量可以与指针一起使用,有 3 组合情况: 指向常量的指针:是指一个指向常量的指针变量 const char*p =“abcd”;,所以不能改变指针指向的字符,比如 p【3】=‘h’ 是错误的,因为它指向的事一个 字符串常量 ,所以不能更改内容,但可以改变该指针的所指方向:如 p=“kkvkvk”;那就是对的; 常指针:是一个指向固定的一个指针; char const *p=“45678”; 若这样子操作则是错的:p=“kkvkvk”;若是 p[3]='k’则对的,因为指向的地址没变; 指向常量的常指针:const char const*p=“46df”;这个就怎么不能改了; int const* a 相当于 const int *a 这是指向常量的指针 (可改变指针指向地址,不能改变指针指向的变量的内容) 不是 int *const a; 这是常指针;(不可以改变指针指向的变量,但可以改变该变量的内容) # include <iostream> using namespace std ; int main ( ) { const int a1 = 7 ; int const a2 = 8 ; int c1 = 9 ; int c2 = 10 ;

重新认识C语言的指针(上)

◇◆丶佛笑我妖孽 提交于 2020-01-13 09:10:22
​ 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!! 序言  指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。 为什么要学习指针?  有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子 Object obj= new Object();Object sec= obj;sec = new Object();  如果你去仔细研究他们的行为,就会发现 obj, sec 都只是一个指向对象的东西,可以为空,也可以修改指向,所以它们其实都是指针,只是 Java 的教材里面不在去提这东西而已,具体原因看我后面讲解便知道了。 ​ 继续说为什么学习指针,为什么学习指针就必须要说到指针的优点了。