指针

JAVA创建数组对象出现空指针

ε祈祈猫儿з 提交于 2020-03-31 04:10:00
在创建数组对象时,通常仅仅使用了创建数组, 而没有对每一个ball对象实例化(对于每一个对象而言,地址为null) public class ball { boolean right = true; boolean left = false; int potion = 0; ball(){ right = true; left = false; potion = 0; } ball[] Y = new ball[n]; for (int i = 0;i < n;i++){ Y[i] = new ball(); }对每一个对象单独实例化,就不会有这样的问题了 来源: https://www.cnblogs.com/SGRS/p/11342296.html

链表中倒数第k个结点

感情迁移 提交于 2020-03-31 02:58:23
题目描述 输入一个链表,输出该链表中倒数第k个结点。 可以用两个指针实现,first和second均指向头指针,将second指针后移动k-1位,然后再将两个指针同时往后 移动,直到second的next指向空。唯一需要注意的就是输入的k必须为正数,且不能超过链表的长度。 public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(k<=0||head==null){ return null; } ListNode first=head; ListNode second=head; for(int i=0;i<k-1;i++){ if(second.next==null){ return null; }else{ second=second.next; } } while(second.next!=null){ first=first.next; second=second.next; } return first; } } 来源: https://www.cnblogs.com/huangbei1990/p/5742422.html

define和typedef

梦想的初衷 提交于 2020-03-31 00:43:35
参考: 【C++】define 和typedef 的详细区别 define与typedef区别与联系 #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。 typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能,它是语言编译过程的一部分,但它并不实际分配内存空间。 一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。 typedef是语句( 以';'结尾),而#define不是语句( 不以';'结尾) typedef int * int_ptr; #define INT_PTR int * const int_ptr p; //p不可更改,但p指向的内容可更改 const INT_PTR p; //p可更改,但是p指向的内容不可更改 int_ptr是一种类型(类型本身就是整型指针),const int_ptr p就是把指针给锁住了p不可更改,而const INT_PTR p是const int * p锁的是指针p所指的对象。这些使用常常使我迷惑,所以搜集整理对他们的理解如下: #define的用法: 1、简单的宏定义 #define MAXTIME

c++学习笔记

社会主义新天地 提交于 2020-03-30 21:50:51
1 函数 1.1 内联函数 inline bool isNumber ( char c ) { return ( c == '1' ); } int main ( int argc , _TCHAR * argv []) { //cout<<" Hello World! \n"; //printf("Hello World!"); if ( isNumber ( '1' )) printf ( "It is a Number" ); else printf ( "It isn't a Number" ); return 0; } 这种用 inline 定义的函数就是内联函数。 内联函数的出现是为了解决效率问题; 内联函数的函数体一般在 1 - 5 行之间; 内联函数内部不允许有控制语句,如果有控制语句,则它只会被当作一般的函数。 2 程序结构 2.1 外部存储类型 默认的函数声明或定义总是 extern 的; 带 extern 的是变量声明,不是变量实现; 2.2 静态函数 在 c++ 中所谓的静态函数和 c #中的是不同的,函数之所以声明为 static ,是为了和 extern 不同,就是让该函数只在这个文件内有效。 2.3 作用域 主要可以分为以下几种: l 局部作用域; void fn () { if ( int i == 5) //i 的作用域自此开始 i = 2* i

Java 对象布局及其组成

吃可爱长大的小学妹 提交于 2020-03-30 18:56:57
Java 对象布局及其组成 在 hotspot 虚拟机中,对象在内存中布局可以被分为三部分:对象头/实例数据/补位数据。下面一张图是一个普通 java 对象和一个数组对象的结构组成: Java 对象组成 Hotspt 采用了 OOP-Klass 模型。 它是描述 java 对象实例的模型,可分为两部分: OOP (Ordinary Object Pointer)指的是普通对象指针,它包含 MarkWord 和Klass 指针。MarkWord 用于存储当前对象运行时的一些状态数据;Klass 指针则指向 Klass,用来告诉当前指针指向的对象是什么类型,即对象是使用哪个类创建出来的 之所以采用这种一分为二的对象模型,是因为 hotspot jvm 的设计者不想让每个对象中都包含一个 virtual table (虚函数表), 所以把对象模型拆成 klass 和 oop,其中 oop 不包含任何虚函数,而 klass 含有虚函数表,可以进行method dispatch 对象的模型如下: volatile markOop _mark; //标识运行时数据 union _metadata { Klass* _klass; narrowKlass _compressed_klass; } _metadata; //klass指针 对象头 对象头主要有两部分(数组对象有三组分)组成。

Go语言入门(六)结构体后续&指针

坚强是说给别人听的谎言 提交于 2020-03-30 17:25:16
结构体后续&指针 指针 变量和内存地址 每个变量都有内存地址,可以通过变量来操作对应的内存 func varMem() { var a int32 = 100 fmt.Printf("addr %p\n",&a) } func pointMem() { var b int32 b = 32 var a *int32 fmt.Printf("addr of a:%v\ntype of a %T\n",a,a) //取出a的地址和类型 a = &b fmt.Printf("a %d addr:%p\ntype of a:%T\nb %d addr %p\n",*a,&a,a,b,&b) } 指针的定义与取值 & : 取地址 * : 取指针对应的值 充分判断指针为nil的情况 func pointMem1() { var a *int b := 200 a = &b *a = 400 fmt.Printf("a=%v,adda=%p,type a=%#T\nb=%v,addb=%p,type b=%#T\n",*a,a,a,b,&b) } func pointMem2() { var a *int var b int = 100 if a == nil { a = &b } fmt.Printf("addr a=%p,value a=%d\naddr b=%p,value b=%d\n"

c++学习笔记:多态

僤鯓⒐⒋嵵緔 提交于 2020-03-30 17:21:18
1.多态:通常是指对于同一个消息、同一种调用,在不同的场合,不同的情况下,执行不同的行为--->重载便是简单的多态 ------->指同一个操作作用于不同的对象就会产生不同的响应; 多态性分为静态多态性和动态多态性   其中函数重载和运算符重载属于静态多态性, 虚函数属于动态多态性---->C++是依靠虚函数来实现动态多态的。 2.C++编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数,称为联编:   1)在编译过程中进行的联编叫静态联编(static binding)或早期联编(early binding)。   2)在程序运行时完成,动态联编”(dynamic binding)也叫晚期联编(late binding)---->C++通过虚函数来实现动态联编 3.虚函数:vitual   1.与基类的虚函数有相同的参数个数;   2.与基类的虚函数有相同的参数类型;   3.与基类的虚函数有相同的返回类型。   注意点:1. 基类的成员函数定义为虚函数,那么,它在所有派生类中也保持为虚函数;即使在派生类中省略了virtual关键字,也仍然是虚函数。       2.构造函数不可为虚函数--->一旦为虚函数相当于重新,在构造子类时无法找到基类构造函数从而无法构造对象。       ( 1. 根据继承的性质,构造函数执行顺序是: A() B() 2. 根据虚函数的性质

星号的秘密

北慕城南 提交于 2020-03-30 17:20:42
1 、乘法运算符 2 、定义指针 int *p = 0; 还是 int* p = 0;? 后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇怪的东西。但是后面一种写法会带来一个容易产生的误解: int* p1, p2; 这儿给人的感觉似乎是定义了两个指针型变量p1和p2,但是,事实上,这种直觉是错误的,正确的理解方式是int *p1, p2;即p1是指针型的,而p2确是整型的。 在MS VC++ 6.0中,是按照后面一种格式写的。 3 、何谓指针? 指针仅仅表示一个内存中的某个地址? 非也,注意到,我们在定义指针的时候,都关联了一个类型,如int,char,或者是string等等,如果说指针仅仅表示一个内存中的地址,那何必要关联这么多变化的东西呢?完全可以DWORD p=0;这样解决问题。 关联了的数据类型是作何用的呢? 它可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。如 int *p; 编译器可以从这个定义中获得信息:1、p指向的内存存放的是整型数据,2、由于该内存区域只存放了一个数据,跨越的内存区域为4个字节,即p+1的效果是跳过了四个字节。 另一个复杂一点的例子,如 struct a {int x1; short x2; a *next; } 定义指针 a

C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

偶尔善良 提交于 2020-03-30 17:15:54
   C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容。指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法。C++继承这一高效的机制,同时引入了另一个与指针相似但 不相同的机制: 引用。 一、引用   简单的来说,引用就是变量的别名(alias), 通过别名我们可以操作引用代表的变量。 定义一个引用的语法如下所示:     变量类型 &引用标识符 = 变量名。 Exp:   int iVar=10;   int &iRef = iVar;   iRef = 20 ;   cout<<iVar<<endl;   这段程序执行的结果就是输出: 20 ;   程序通过引用 iRef 改变了变量iVar的值。 要点:   1、在定义引用的同事必须初始化,指出引用代表的是哪一个变量,而且这种“指向关系”不能改变。   2、引用只是对象的另一个名字,可以通过对象的原标识符访问对象,也可以通过对象的引用访问对象。   3、在一个语句定义多个引用的时候,每个引用标识符(引用名)的前面必须都加上&符号,否则就是错误。 1、const引用   const引用是指向const对象的引用, 不能通过const引用改变原对象的值。如下所示: 1 #include <iostream> 2 #include <string> 3

C++星号的含义

爷,独闯天下 提交于 2020-03-30 17:03:04
1 、乘法运算符 2 、定义指针 int *p = 0; 还是 int* p = 0;? 后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇怪的东西。但是后面一种写法会带来一个容易产生的误解: int* p1, p2; 这儿给人的感觉似乎是定义了两个指针型变量p1和p2,但是,事实上,这种直觉是错误的,正确的理解方式是int *p1, p2;即p1是指针型的,而p2确是整型的。 在MS VC++ 6.0中,是按照后面一种格式写的。 3 、何谓指针? 指针仅仅表示一个内存中的某个地址? 非也,注意到,我们在定义指针的时候,都关联了一个类型,如int,char,或者是string等等,如果说指针仅仅表示一个内存中的地址,那何必要关联这么多变化的东西呢?完全可以DWORD p=0;这样解决问题。 关联了的数据类型是作何用的呢? 它可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。如 int *p; 编译器可以从这个定义中获得信息:1、p指向的内存存放的是整型数据,2、由于该内存区域只存放了一个数据,跨越的内存区域为4个字节,即p+1的效果是跳过了四个字节。 另一个复杂一点的例子,如 struct a {int x1; short x2; a *next; } 定义指针 a