指针变量

c语言指针

限于喜欢 提交于 2020-03-12 10:02:56
1. 指针是一种数据类型 如:int * ,char * ,*单目运算符,表示指针上的变量; 2.取变量的地址用& 如int a = 1; int * p = &a 表示把指向a的内存地址赋给 指针变量 p; 3.指针变量可以做左值,也可以做右值 如 int a = 1; int * p = &a; int b = *p; ( 右值) *p = 2; ( 左值 ) 4.数组指针(指向数组中第一个元素的常量指针) 如 int k[] = {0,1,2,3}; (数组变量k本身表达地址) int * p = k; p = k[0] p = &k; 来源: https://www.cnblogs.com/wasoft/p/12467234.html

delete指针以后应赋值为NULL

删除回忆录丶 提交于 2020-03-12 08:38:03
delete指针以后应赋值为NULL delete p后,只是释放了指针中存放的地址中的内存空间。但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址。 例如: 对一个非空指针delete后,若没有将p赋为NULL,若再次delete的话,会出现问题。 如下代码: # include <iostream> int main ( ) { int * p = new int ( 3 ) ; delete p ; delete p ; return 0 ; } 在ubuntu14.04中使用g++进行编译无问题,但运行时报错如下: 意思就是对同一指针变量进行了两次释放内存的操作,这是不合法的。 因为第一次释放后,指针p指向的那块区域已经变为不可访问区域了,再执行一次delete p,试图对一块不可访问的区域进行释放,这是不合法的。 将其改为: # include <iostream> int main ( ) { int * p = new int ( 3 ) ; delete p ; p = NULL ; delete p ; return 0 ; } 则编译和运行都没有问题,因为C++保证delete值为NULL的指针是安全的。 ///////////////////////////////////////////////////////////////

C指针方面笔试题分享

て烟熏妆下的殇ゞ 提交于 2020-03-12 05:14:44
今天总结分享几个关于C语言指针方面的一些笔试题,主要是对前些日子练习的一些总结,同样也希望看到这篇文章的人,对你能有所帮助。如果有错误的部分,也希望即使指正 笔试题1. `int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }` 程序的运行结果是什么 首先,从这段代码中可以看到定义了一个长度为5的数组a,然后定义了一个指针ptr,将 ptr指向(int*)(&a+1),(&a+1)数组名取地址再加1,是跳过整个数组,指向a[4] 后面的地址,(int*)再将int(*)[5]类型的变量强转为int(*)类型,然后打印 *(a+1),数组名加1,在C语言中a将强制转换为a[0]的地址意味着数组的首元素地址向 后跳过一个元素即为a[1]的地址,在解引用打印数字为2,*(ptr-1)则是将ptr指针向前 跳过sizeof(int)个字节,在解引用,于是打印的结果回事a[4]中的数值,也就是5, 于是此题的答案则为2,5 笔试题2. struct Test { int Num ; char * pcName ; shortsDate ; char cha [ 2 ] ; shortsBa [ 4 ] ;

记录一下jvm的相关知识点

有些话、适合烂在心里 提交于 2020-03-11 13:22:06
java 运行时数据区域: 程序计数器 => (每个线程都包含一个程序计数器)用来记录字节码执行的行号,字节码指令的循环,跳转,异常处理,线程恢复等需要依靠计数器。 Java虚拟机栈 => 主要用来描述Java方法执行的内存模型,(每个线程都包含一个虚拟机栈)主要用来处理方法的调用,虚拟机栈中的存储单元是栈帧,方法在执行的同时都会在虚拟机栈中创建一个栈帧,栈帧包含操作数栈,局部变量表,动态链接和方法出口等,每个方法从调用到执行完毕都对应着一个栈帧在虚拟机栈中的入栈和出栈的过程。局部变量表的存储单位为slot(4个字节),因此double 和long类型需要占用2个slot的存储空间。 栈的深度有一定限制,当深度操作最大的调用栈大小会出现StackOverflowError异常。 本地方法栈 => 为虚拟机执行java方法的服务(native方法),类似虚拟机栈 java堆 => 对象和数组存储的场所,也是gc收集器的主要管理区域,现在收集器基本采用分代收集算法,可通过-Xmx -Xms来分配堆内存大小,当堆内存无法分配内存时,会出现OutOfMemoryError异常。 方法区 => 用于存储已被虚拟机加载的类信息,静态变量,常量以及即时编译器编译后的代码等,方法区无法分配内存是会出现OutOfMemoryError异常。 运行时常量池 =>方法区的一部分

C++类的大小计算汇总

≯℡__Kan透↙ 提交于 2020-03-11 03:59:33
  C++中类涉及到虚函数成员、静态成员、虚继承、多继承、空类等。   类,作为一种类型定义,是没有大小可言的。   类的大小,指的是类的对象所占的大小。因此,用sizeof对一个类型名操作,得到的是具有该类型实体的大小。 类大小的计算,遵循结构体的对齐原则; 类的大小,与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常量数据成员,均对类的大小无影响; 虚函数对类的大小有影响,是因为虚函数表指针带来的影响; 虚继承对类的大小有影响,是因为虚基表指针带来的影响; 静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类所有的对象所共享,并不属于具体哪个对象,静态数据成员定义在内存的全局区; 空类的大小( 类的大小为1 ),以及含有虚函数,虚继承,多继承是特殊情况; 计算涉及到内置类型的大小,以下所述结果是在64位gcc编译器下得到(int大小为4,指针大小为8); 一、简单情况的计算 #include<iostream> using namespace std; class base { public: base()=default; ~base()=default; private: static int a; int b; char c; }; int main() { base obj; cout<<sizeof

C++三大特性

青春壹個敷衍的年華 提交于 2020-03-10 23:58:03
封装继承和多态 封装:隐藏实现细节,使得代码模块化,封装就是把过程和数据包装,将客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操纵,对其他信息隐藏。 类继承是指C++提供来扩展和修改类的方法,类继承就是从已有的类中派生出新的类,派生类继承了基类的特性,同时可以添加自己的特性,继承又分为 单一继承 多重继承 菱形继承 多态是在具有继承关系的类对象中去调用某一虚函数时(使用基类的指针/引用去调用同一函数),产生了不同的行为,构成多态的条件有两个( 说白了就是通过指针/引用在不同时候调用同一函数可能调用的是不同的版本,多态是指接口的多种不同实现方式 ) 调用函数的对象必须是指针或者引用 被调用的函数必须是虚函数,且完成了虚函数的重写(不覆盖会调用派生类的函数吗?) 动态(类型)绑定/静态(类型)绑定 静态类型:对象在声明时的类型,其在编译时决定 动态类型:变量所指向内存中该对象的类型(通常指指针/引用所绑定对象的类型),在运行期决定 静态类型决定了某个函数能不能被调用,而动态类型则在动态绑定发生时决定调用该函数的哪个版本 如果不使用指针和引用,则静态类型和动态类型一定相同 静态绑定:也叫静态联编,绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译器 动态绑定:也叫动态联编,绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型

scanf与printf用法详解

ⅰ亾dé卋堺 提交于 2020-03-10 09:10:36
一、scanf家族 1、scanf家族的原型 int scanf(char const *format,...); int fscanf(FILE *stream,char const *format,...); int sscanf(char const *buffer,char const *format,...); 每个原型中的省略号表示一个可变长度的指针列表。从输入转换而来的值逐个存储到这些指针指向的内存位置。由于C的参数传递都是传值调用决定了可变参数都是指针列表。注意:若给的不是指针,而是变量值。scanf将把变量值当做指针,在进行解引用时或者导致程序终止,或者导致不可预料的内存位置的数据被改写。 2、返回值 当格式化字符串format到达末尾或者读取的输入不再匹配格式字符串所指定的类型时,输入就停止,并返回被转换的输入值的数目,若在任何输入都没被转换之前文件就到达尾部则返回EOF。 3、类型的匹配 由于scanf是采用可变参数的机制,所以函数无法验证它们的指针参数是否为正确的类型,所以函数假定它们是正确的,(因此格式字符必须和后面的指针指向的类型保持一致)如果指针参数的类型和输入数据的类型不匹配则结果值就是垃圾。而且邻近的变量也有可能被改写。例如: float a; scanf("%d",&a); //本来a是一个float数据,却用一个整形指针指向变量a。 4

有序单链表删除重复元素

左心房为你撑大大i 提交于 2020-03-10 06:45:51
前言 本文从有序单链表入手,主要思想是定义三个结构类型指针来解决有序单链表删除重复元素的问题。 图示 其中 flag 作为标杆值, p 去寻找相同的值。若相同则 p 移动到下一个,同时定义结构指针 q 指向其多余的结点以释放内存;若不同则 flag 和 p 都向下移动。( PS :单链表有序且已有数据储存) 代码 node结构(举例说明) typedef struct _Node { int data ; //数据域 struct _Node * next ; //指针域 } node ; listDelDuplicates()函数 void listDelDuplicates ( node * & head ) { //定义变量 node * flag = head ; //flag作为标杆值 node * p = head - > next ; //P移动寻找相同值 while ( p ) { if ( flag - > data == p - > data ) //若flag的值和p的值相同时 { node * q = p ; //定义一个q去指向p,目的是为了释放内存 flag - > next = p - > next ; //flag的next指向p的next p = p - > next ; //p指向下一个结点 delete q ; //释放q所指的结点 }

C++笔记(六)——I/O&异常

荒凉一梦 提交于 2020-03-10 05:16:32
iostream 标准库 提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 · 标准库 fstream 定义了三个新的数据类型用于文件的访问。 · open() 函数 是 fstream、ifstream 和 ofstream 对象的一个成员。open() 成员函数的 第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式 。可以把以上两种或两种以上的模式结合使用。 void open ( const char * filename , ios :: openmode mode ) ; //以写入模式打开文件,并希望截断文件,以防文件已存在 ofstream outfile ; outfile . open ( "file.dat" , ios :: out | ios :: trunc ) ; //打开一个文件用于读写 ifstream afile ; afile . open ( "file.dat" , ios :: out | ios :: in ) ; · close() 函数 用于关闭文件(通常应该在程序结束前关闭),close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。 void close ( ) ; ·使用流插入运算符( << )向文件写入信息,使用的是 ofstream 或

指针和数组

我的未来我决定 提交于 2020-03-09 13:39:43
待到秋来九月八,我花开后百花杀 指针和数组的区别 数组名在不同情况下都是什么? 指针数组 指针和数组的区别 首先我们看一段代码,在编程中是否遇到过这样的情况? # include <stdio.h> int main ( ) { int a [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 } ; printf ( "%d\n" , a [ 1 ] ) ; printf ( "%d\n" , * ( a + 1 ) ) ; int * p = a ; printf ( "%d\n" , p [ 1 ] ) ; printf ( "%d\n" , * ( p + 1 ) ) ; return 0 ; } 我们可以看到使用数组名和使用指针的效果一样。 那是否就能说明数组和指针有某种关系,甚至是一样的呢? 实际上指针和数组毫无关系。 首先,数组是数组变量类型,指针式指针变量类型,从变量类型角度来说就不同。 数组名是没有单独开辟空间的,而指针开辟了自己的空间,这就是他们最大的不同。 数组传参时,会发生降维(降维成指向其内部元素类型的指针),既然能够降维成指针,则说明两者不同。 他们在使用上不过是有一定相似性罢了。 有了上面的经验,我们也就可以知道了: int arr [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 ,