指针变量

JAVA 中的null

对着背影说爱祢 提交于 2020-01-11 07:46:23
对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。Java为什么要保留null呢?null出现有一段时间了,并且我认为Java发明者知道null与它解决的问题相比带来了更多的麻烦,但是null仍然陪伴着Java。 我越发感到惊奇,因为java的设计原理是为了简化事情,那就是为什么没有浪费时间在指针、操作符重载、多继承实现的原因,null却与此正好相反。好吧,我真的不知道这个问题的答案,我知道的是不管null被Java开发者和开源社区如何批评,我们必须与null共同存在。与其为null的存在感到后悔,我们倒不如更好的学习null,确保正确使用null。 为什么在Java中需要学习null?因为如果你对null不注意,Java将使你遭受空指针异常的痛苦,并且你也会得到一个沉痛的教训。精力充沛的编程是一门艺术,你的团队、客户和用户将会更加欣赏你。以我的经验来看,导致空指针异常的一个最主要的原因是对Java中null的知识还不够。你们当中的很多已经对null很熟悉了,但是对那些不是很熟悉的来说,可以学到一些关于null老的和新的知识。让我们一起重新学习Java中null的一些重要知识吧。 Java中的Null是什么? 正如我说过的那样,null是Java中一个很重要的概念

C/C++中的const、static、inline、friend、template、virtual、异常机制等特性

徘徊边缘 提交于 2020-01-11 07:16:46
一、const const关键字的作用 (1)作用: 1)欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了; 2)对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const; 3)在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值; 4)对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量; 5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。 const修饰变量 变量的值不能改变 const修饰指针 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量 指针常量:不能通过指针来修改变量的值。 常量指针:一直指向该变量,不能给该指针赋予其他地址 函数中使用const const修饰函数参数 表示参数不可变 若参数为引用,可以增加效率 const引用传递和函数按值传递的效果是一样的,但按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效 const按值传递时只是外部对象的拷贝,值的改变不会对外部有什么影响

浅谈C++中指针和引用的区别

╄→尐↘猪︶ㄣ 提交于 2020-01-11 06:46:00
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。 而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。 (2)可以有const指针,但是没有const引用; (3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的) (4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; (5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。 (6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小; (7)指针和引用的自增(++)运算意义不一样; 2.指针和引用作为函数参数进行传递时的区别。 (1)指针作为参数进行传递: 复制代码 #include<iostream>

指针数组和数组指针的区别

蹲街弑〆低调 提交于 2020-01-11 05:02:00
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a

2019春第六周作业

拥有回忆 提交于 2020-01-11 03:02:03
这个作业属于哪个课程 C语言程序设计Ⅱ 这个作业要求在哪里 2019春第六周作业 我在这个课程的目标是 充分理解指针与数组在函数中的调用过程 这个作业在哪个具体方面帮助我实现目标 锻炼我的思维 参考文献 C语言程序设计(第三版) 基础题 1.求两数平方根之和 函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double a, double b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 1)实验代码 #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", y ); return 0; } double fun(double *a,double *b) { double sun; sun=sqrt(*a)+sqrt(*b); return sun; } 2)设计思路 3)本题调试过程中碰到问题及解决办法 问题:没看清题目要求,忘记返回计算的值。 解决办法

typedef和#define的用法与区别

放肆的年华 提交于 2020-01-10 18:21:32
转:http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html 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与

数组初始

岁酱吖の 提交于 2020-01-10 16:26:14
空数组 $arr=array(); var_dump($arr); gettype():得到变量的类型 echo gettype($arr);//array(0) {} 通过is_array():检测变量是否为数组 var_dump(is_array($arr));//arraybool(true) 如果数组下标重复,后面的覆盖前面的值 $arr=array( 'a', 0=>'b' ); var_dump($arr); //array(1) { //[0]=> // string(1) "b" //} 如果新添加元素没有指定下标,它的下标为已有下标最大值加1(已有下标不全为负数) $arr=array( 'a','b','c', 5=>'d', 19=>'e', 'f' ); //var_dump($arr); //array(6) { // [0]=> // string(1) "a" // [1]=> // string(1) "b" // [2]=> // string(1) "c" // [5]=> // string(1) "d" // [19]=> // string(1) "e" // [20]=> // string(1) "f" //} 如果已有下标都为负数,那么新添加元素的下标从0开始 $arr=array( -12=>'a', -43=>'b', 'c' )

c语言中的string

百般思念 提交于 2020-01-10 12:28:24
1. strlen(char const* s);   函数传入的是c风格字符串(即以‘\0’结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'。 2. strcpy(char* dest, char const* source);   dest:目标指针;   source:是源指针,传入的必须是c风格字符串或者字符数组。   返回值: dest指针   注意:1. 该函数会将包括'\0'在内的source全部拷贝到dest。如果char* source="abcd"; dest为char[],则dest应该定义为char[5];       2. src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。       3. C语言中不支持用赋值符号“=”直接将一个字符数组赋值给另一个字符数组。因为C语言不支持运算符重载。故而必须用strcpy操作。 3. strncpy(char* dest, char const* source, size_t n);   n代表可以指定字符个数进行赋值。   功能:将字符串source中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。要求:如果n > dest串长度

C++ Primer:第2章总结

随声附和 提交于 2020-01-10 11:39:17
第2章 变量和基本类型 2.1 基本内置类型 基本内容: 算术类型包含字符,整型数,布尔值和浮点数,空类型不对应具体值,仅用于无返回值时函数的返回类型等特殊场合。 类型转换:将对象从一种给定的类型转换为另一种类型。 字面值常量:整型字面值,浮点型字面值,字符字面值,字符串字面值,转义序列,字面值前缀和后缀,布尔字面值,指针字面值。 备注: 整型包括布尔类型和字符类型。 bit是数据存储的最小单位,byte是数据处理的基本单位,字是整数运算的自然单位:1 word = 4 byte(32位机器), 1byte = 8 bit。 类型选择:若数值不为负选用无符号类型;整型运算选用int;算术表达式不用char或bool;浮点数运算选用double。 切勿混用带符号类型和无符号类型。 2.2 变量 基本内容: 变量定义:类型说明符+变量名列表。初始化,列表初始化,默认初始化。 变量声明与变量定义:声明和定义都规定变量的类型和名字,此外定义申请存储空间,可能初始化;变量只能定义一次,声明多次。 标识符:由字母、数字和下划线组成,必须以字母或下划线开头,区分大小写。 名字作用域:全局作用域,块作用域,内层作用域,外层作用域 备注: 初始化 != 赋值。 用{}进行列表初始化,函数体内部的内置类型变量不会被默认初始化。 变量名用小写,类名以大写开头,多个单词用下划线连接。 变量第一次使用时

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

折月煮酒 提交于 2020-01-10 08:57:02
引言   上一章我们已经介绍了汇编语言的基础部分,包括数据格式、寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了。这些指令大多数都非常简单,但是组合在一起却能模拟出我们程序当中想要的任何效果,确实是十分神奇的一件事。    数据传送指令   数据传送指令的目的是为了将一个数据从一个位置复制到另外一个位置。既然如此,那么数据传送指令就会包含一个源操作数和一个目的操作数,指令会将原操作数的值复制到目的操作数并覆盖。   数据传送指令一共可分为五种,分别是mov、movs、movz、push以及pop,下面LZ依次介绍一下这五个指令的作用。    mov指令   mov指令的作用是将源操作数S中的数据复制到目的操作数D中,mov指令有一个数据格式和两个操作数,因此一般的形式为[movx S D]。其中x为数据格式,S为源操作数,D为目的操作数。   这里举一个简单的例子,比如我们有一条指令为movl %edx %eax。那么它的执行过程就如下图所示。   可以看到,在指令执行之后,%edx寄存器当中的内容会被复制到%eax寄存器。需要一提的是,mov指令可以在后面加上任何数据格式,比如上面这一过程中,数据格式则为四个字节,也就是双字。因此不难推断出,我们还可以使用movb和movw去复制一个字节或者两个字节。 movs指令