指针变量

5数组指针和引用:数组

谁说我不能喝 提交于 2020-03-29 10:06:19
数组 一维数组:数据类型 数组名 [常量表达式] 注意: 命名规则和变量名相同 数组后面一定是[],方括号内 是常量表达式 常量表达式表达元素的个数,即数组的长度 定义数组的常量表达式不能是变量 引用: 一维数组引用的一般形式:数组名[下标] 数组元素的下标起始值为0 初始化: 单个元素逐一赋值 a[10]=1;a[9]=100;...... 聚合方式赋值 int a[10]={1,2,.....10} ; int a[]={1,2,.....10} ; int a[10]={1,2,.....7} 没被赋值的元素 默认补0 二维数组:数据类型 数组名[常量表达式1][常量表达式2] 注意: 数组名按照标识符命名 二维数组有两个下标 a[3][4] 下标一定是整数a[3][4]表示有12个元素 声明的时候 下标不能是变量 一维数组:连续的内存单位进行排序 二维数组:存储形式与一维相同 引用: 数组名[下标][下标] 起始值从0开始 初始化: 单一元素逐一赋值 聚合方式赋值 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int a[3][4]={1,2,3,4} 后面补0; int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}} 字符数组:char 数组名 [常量表达式] 初始化: 聚合方式 char a

Go语言基础之指针

心已入冬 提交于 2020-03-28 12:38:02
前言 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针。 什么是指针 不管是Python还是Go程序 执行过程中数据载入内存后,在计算机内存中都有它们的内地址,这就是指针。 指针的作用就是 保存某1个数据在内存中的内存地址, 方便我们在内存中快速查找到该数据(变量)。 在Go语言中的 值类型 (int、float、bool、string、array、struct) 都有对应的指针类型 ,如: *int 、 *int64 、 *string 等。 指针操作 package main import "fmt" func main() { //基本数据类型在内存中的布局 var i int = 10 //获取变量i的内存地址 fmt.Println("变量i的内存地址:", &i) //声明1个 ptr指针变量,指向1个类型为int的内存地址 var ptr *int = &i fmt.Println(ptr) //获取指针的内存地址 fmt.Println(&ptr) //通过指针获取变量i对应的值(10) fmt.Println(*ptr) //通过指针修改变量i对应的值 *ptr = 222 fmt.Println(i) //通过指针修改变量的值 name := "成龙" age := "18" por1 := &name *por1 =

C++指针系列

删除回忆录丶 提交于 2020-03-28 05:20:46
写这篇文章总结C++指针的用法。 在C++中最好不要用new/delete来使用指针,而应该用智能指针来管理资源,智能指针就属boost做得最好了。boost的源码和使用方法在网上随便一搜就可以找到,在此就不哆嗦了。下面进入正文—— 最后的指针 1. delete , delete[]的区别   虽然要放弃new/delete的用法,但在这里还是要讲一个值得注意的地方。   int* arr=new int[3]; //不同于new int(3),用[]是指明arr是具有3项的数组,而()是给申明一个整数,其初值为3   在这总情况下,下面两种delete都正确   delete arr; //OR delete [] arr; 2. const不同位置的区别 const int *p = new int(4); //或者 int const *p = new int(4); 这里用const后,就不能 *p = 5 ; 进行赋值。这时*p所指内容不能修改。 int *const p = new int(4); 不能用 p = NULL ; 这里p本身不能被修改 3. 将指针作为参数时的注意事项 如果将一个指针传入函数,并且在这个函数中分配内存后再赋值,那么得用两维指针。如下 void GetValue(int *v) //这个代码是错误的 { v = new int; *v =

C++this指针详解

心不动则不痛 提交于 2020-03-28 05:18:12
  以前对this指针误解挺多的,在这里单独写一篇进行总结,有不对之处,欢迎指正批评! 一、问题 1.一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么成员函数如何知道要访问哪个对象的数据成员呢?   没错,就是通过this指针。每个对象都拥有一个this指针,this指针记录对象的内存地址,当我们调用成员函数时,成员函数默认第一个参数为T* const register this,大多数编译器通过ecx寄存器传递this指针,通过 this 这个隐式参数可以访问该对象的数据成员。 2.类的成员函数为什么不能用static和const同时修饰?   类中用const修饰的函数通常用来防止修改对象的数据成员,函数末尾的const是用来修饰this指针,防止在函数内对数据成员进行修改,而静态函数中是没有this指针的,无法访问到对象的数据成员,与C++ static语义冲突,所以不能。 二、this指针注意点 1.C++中 this关键字 是一个指向对象自己的一个常量指针,不能给this赋值; 2.只有成员函数才有this指针,友元函数不是类的成员函数,没有this指针; 3.同样静态函数也是没有this指针的,静态函数如同静态变量一样,不属于具体的哪一个对象; 4.this指针作用域在类成员函数内部,在类外也无法获取; 5.this指针并不是对象的一部分

JVM史上最最最完整深入解析(12000字噢)

空扰寡人 提交于 2020-03-27 18:12:07
3 月,跳不动了?>>> 点点这个链接免费获取: 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 工作之余,总结一下JVM相关知识。 Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。(1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double

php文件函数

徘徊边缘 提交于 2020-03-27 15:14:54
文件函数库 文件、目录函数库为 PHP 核心函数库,可以通过其提供的 API 完成对于文件及目录的常用操作。 文件信息相关的 API /* * 文件信息相关API * filetype(), filesize(), filectime(),filemtime(), fileatime() */ $dirname = "./"; $filename = "./11.txt"; // string filetype(string filename):返回文件的类型 echo '文件类型为:', filetype($dirname), "\n"; //dir echo '文件类型为:', filetype($filename), "\n"; //file //int filesize(string filename):返回文件大小的字节数 echo '文件大小:', filesize($filename), "\n"; //int filectime(string filename):返回文件的创建时间的时间戳 echo '文件的创建时间:', date('Y-m-d H:i:s', filectime($filename)), "\n"; //int filemtime(string filename):返回文件的最后修改时间的时间戳 echo '文件的修改时间:', date('Y

JVM笔记(一) Java内存区域

蓝咒 提交于 2020-03-27 08:38:33
Java 内存区域 总概 java虚拟机在执行java程序的过程中,会把它管理的内存划分为几个不同的数据区域。每当运行一个java程序时,就会启动一个虚拟机。 具体的区域如图所示: 同时,方法区 与 堆 是由所有线程共享的数据区;而 虚拟机栈、本地方法栈、程序计数器 则是被线程隔离的区域。 一、程序计数器 什么是程序计数器? 概念 :就是当前线程所执行的字节码的行号指示器。 JVM的概念模型中,字节码解释器通过改变这个计数器的值来选取下一条字节码指令。 JVM的多线程其实就是通过线程轮流切换并分配处理器执行时间的方式来实现的( 在任何一个确定的时刻内,一个处理器都只会执行一条线程中的指令 )。为了线程切换后能够恢复到正确的执行位置,每条线程都需要有 独立的程序计数器 ,各线程计数器互不影响,独立存储。 所以,程序计数器是 线程私有 的内存区域 如果线程执行一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,则计数器的值为空。 Java虚拟机规范中唯一一个 没有规定任何OutOfMemoryError情况 的区域。 二、Java虚拟机栈 线程私有,生命周期与线程相同。 虚拟机描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个 栈帧(Stack Frame) 用于存储局部变量表、操作数栈、动态链接、方法出口等信息。(PS

小沈的C++学习7——指针

[亡魂溺海] 提交于 2020-03-25 15:00:59
  这节课终于学到指针了,话说感觉我是不是在前面几篇博客已经用过不少次这玩意了。但是指针到底是个什么东西呢?今天就让我们来学习指针这个东西。   首先我们小学一年级就学过,电脑里面有内存这个东西,就是利用电位高低存储各种数据,然后可以让cpu各种调用的小容器,而各种数据就听从程序的指挥,在一个个小格子里落户,这个格子就是内存地址。这个时候如果一个函数内部运行的时候在内存上留下了一串数据,它想把这一串数据都交给主函数,那它就可以直接把某个小格子的位置告诉主程序,主程序就可以利用这个位置信息直接到内存里去找这个函数留下来的数据。而这个位置信息就是指针。   首先我们要知道,指针本身也是一种数据,意思就是我们拿到一个指针,到指针指的位置上拿到一个数据,可能也是一个指针。   有了指针,我们甚至可以自己创造一个数据类型。比如我们所有函数都遵循这样一个约定:返回一个指针,指针指向一个指针数组,指针数组的一个指针指向一个数字,代表这个数据的长度或者内存长度,第二个指针指向另一个数字数组,代表这个数据里面每个数据的数据类型,第三个及之后的指针则指向各个数据。这个数据类型是不是很熟悉?没错,只要我们愿意,我们也可以手作一个列表。并且由于指针可以指向指针,这个列表可以不断嵌套(禁止禁止套娃)。 一、指针定义和运算 首先既然我们有了地址,那我们也要知道地址的数据有多长,是个什么类型的数据

作业10总结

孤人 提交于 2020-03-25 08:43:54
一、知识点:   1.指针表量的概念:     变量可以用来存放数值(如整数、实数等),也可以用来存放地址(另一个变量的地址),这种专门用于储存指针(地址)的变量就称为指针变量。   2.指针变量的定义:     在定义指针变量时,需要用指针声明符“*”表示此变量并非一般变量,而是用来存放其他变量地址的指针变量。由于每一个变量都属于一个特定类型 ,因此在定义指针变量时,需要声明该变量的类型,以便能够通过指针正确访问特定类型的数据。     定义一个指针的语法格式为:       基类型标识符 *指针变量名;   (1)“基类型”就是指针所指数据的类型。   (2)定义指针变量的时,在指针变量名前加符号“*”。“*”称为指针声明符,用于说明其后的名字是一个指针变量名。   3.指针变量名的初始化和赋值:     和其他变量一样,指针变量也可以进行初始化。可以用变量的地址对指针变量进行初始化,但必须注意:该变量的类型必须和指针变量的基类型相同。也可以用一个指针变量的值给另一个指针变量赋值,但它们应该具有相同的基类型。   4.引用指针变量:     当一个指针变量被初始化或被赋值之后,它就指向一个特定的变量。这时,就可以使用指针访问它所指向的内存空间。使用指针访问它所指向的内存空间的方法是在指针变量名前加一个“*”号。此处的“*”号是“指针运算符”。又称为“间接访问运算符”,它作用于

C++的那些事:你真的了解引用吗

柔情痞子 提交于 2020-03-25 07:42:34
一、引用的本质是什么 说到引用,一般C++的教材中都是这么定义的: 1,引用就是一个对象的别名。 2,引用不是值不占内存空间。 3,引用必须在定义时赋值,将变量与引用绑定。 那你有没有想过,上面的定义正确吗?编译器是如何解释引用的? 这里先给出引用的本质定义,后面我们再进一步论证。 1,引用实际是通过指针实现的。 2,引用是一个常量指针。 3,引用在内存中占4个字节。 4,在对引用定义时,需要对这个常量指针初始化。 二、探究本质 我们从最简单的变量的定义开始,看编译器会做哪些事情。 int var = 42; mov dword ptr [var],2Ah // 对应汇编代码 上面语句申请了一块内存空间,占4个字节,存放了一个int型的变量。内存里放的是42的二进制码。 汇编代码向我们表达的意思就是把42写入以var为地址的内容区域。var有点像我们理解上的指针,只是编译器并没有把它抽象出来,而是让我们更表象的理解:申请一个变量,它的值为42。 那么 var这个变量名放在哪呢 ? 我们知道程序如果访问内存里的数据,需要通过地址来进行访问,所以上面的代码在经过编译器生成目标代码时,用存放42的地址了所有的var,所以结论时, 目标文件中不存在var,所以变量名本身是不占内存的 。 而我们知道,引用是变量的一个别名。那么,从这很多人会联想到,引用会不会也只是一个名字而已