指针

初识Java

不羁的心 提交于 2020-01-23 03:30:24
Java三大版本 • J2SE Java的标准版本 (Java2 Standard Edition) 定位在客户端,主要用于桌面应用软件的编程 • J2ME (Java2 Micro Edition) 主要应用于嵌入式系统开发,如手机和PDA的编程 • J2EE 企业版本(Java2 Enterprise Edition)定义在服务器端Java2的企业版,主要用于分布式网络程序的开 发,如电子商务网站 • 2005 JavaOne大会召开,Sun公司公开Java SE6。此时,Java的各种版本被更名,取消其中的数字"2": J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME Java特点 1、 Java是跨平台的 JAVA程序的跨平台主要是指字节码文件可以在任何具有Java虚 拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释 器负责将字节码文件解释成为特定的机器码进行运行。 2、Java是简单的 • 不再有#include 和#define 等预处理功能 • 不再有struct,union及typedef • 不再有函数、 • 不再有指针、不再有多重继承 • 不再有goto • 不再有操作符重载(Operatior Overloading) • 不再有全局变量 取消自动类型转换,要求强制转换 • 不再有手动内存管理 3

[SHOI2011]双倍回文

耗尽温柔 提交于 2020-01-23 02:42:02
在建立PAM求len的同时,我们要求出trans。 trans 指针的含义是小于等于当前节点长度的一半最长回文后缀。 当我们新建一个节点后,如果它的长度小于等于 2,那么这个节点的 trans 指针指向它的 fail 节点 否则的话,我们同理从它父亲的 trans 指针指向的节点开始跳 fail 指针 直到跳到某一个节点所表示的回文串的两侧都能扩展这个字符 并且拓展后的长度小于等于当前节点长度的一半 那么新建节点的 trans 的指针就指向该节点的儿子 AC代码: # pragma GCC optimize("-Ofast","-funroll-all-loops") # include <bits/stdc++.h> //#define int long long using namespace std ; const int N = 5e5 + 10 ; struct PAM { int nex [ N ] [ 26 ] , fail [ N ] , len [ N ] , tot , last , trans [ N ] ; inline void init ( ) { len [ 0 ] = 0 , len [ 1 ] = - 1 , fail [ 0 ] = fail [ 1 ] = 1 , tot = 1 , last = 0 ; } inline int insert

让你不再害怕指针!

时光总嘲笑我的痴心妄想 提交于 2020-01-23 02:31:15
如下例1: int *ptr; char *ptr; int **ptr; int (*ptr)[3]; int *(*ptr)[4]; 一、指针的类型 从语法的角度看,你只要把指针声明语句里的 指针名字去掉,剩下的部分就是这个指针的类型 。 这是指针本身所具有的类型。 让我们看看如下各个指针的类型: int *ptr; //指针的类型是 int* char *ptr; //指针的类型是 char* int **ptr; //指针的类型是 int** int (*ptr)[3]; //指针的类型是 int(*)[3] int *(*ptr)[4]; //指针的类型是 int*(*)[4] 二、指针所指向的类型 当你通过指针来访问指针所指向的内存区时, 指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 从语法上看, 你只须把指针声明语句中的 指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型 。 例如: int *ptr; //指针所指向的类型是 int char *ptr; //指针所指向的的类型是 char int **ptr; //指针所指向的的类型是 int* int (*ptr)[3]; //指针所指向的的类型是 int()[3] int *(*ptr)[4]; //指针所指向的的类型是 int*()[4] 在指针的算术运算中,

第三章 语义陷阱

北慕城南 提交于 2020-01-23 01:53:40
3.5 空指针不等于空字符串 由编译器保证0么有效的指针。 当常数0转化为指针时,这个指针不能被解引用。换句话说。当我们将0赋值给一个指针变量时,绝对不能企图使用该指针所指向的内存中存储的内容。 3.6边界计算与不正确称边界 3.7求值顺序 C语言中仅仅有四个运算符(&&。||,?:,,)存在规定的求值顺序。 逗号是先对左側表达式求值。然后丢弃该值,再对右側求值。 其它的比如a>b,编译器有可能先对a求值也有可能对b求值。 以下的程序是不正确的,由于求值顺序不定: i=0; while(i<n) y[i]=x[i++]; y[i]的地址是不确定的。 3.9整数溢出 在无符号算数运算中。没有所谓的‘溢出’一说:全部的无符号运算都以2的n次方为模。n是结果中的位数。 假设算数运算中的操作数,一个是有符号整数,还有一个是无符号整数,那么有符号整数会被转换为无符号整数操作,溢出不会发生。 版权声明:本文博主原创文章,博客,未经同意,不得转载。 来源: https://www.cnblogs.com/yxwkf/p/4759264.html

C陷阱与缺陷--读书笔记3 语义“陷阱”

北城余情 提交于 2020-01-23 01:51:14
第三章 一、知识点 1、C语言中的数组值得注意的地方有以下两点:(P41) (1)、C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外打的一个数组。 (2)、对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去十一数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。 2、对于int calendar[12][31]; 这个语句生命了calendar是一个数组,该数组拥有12个数组类型的元素,其中每个元素都是一个拥有31个整型元素的数组。(P42) 3、如果两个指针指向的是同一个数组中的元素,我们可以把这两个指针相减。(P43) 4、*(a+i)即数组中下标为i的元素的引用。由于a+i与i+a的含义一样,因此a[i]与i[a]也具有同样的含义。(P44) 5、来看几个声明:(P45) int calendar[12][31]; int *p; int i; calendar[4]是calendar数组的第5个元素,是calendar数组中12个有着31个整型元素的数组之一。可以有 p = calendar[4];

x86_64处理器的指针赋值是原子操作吗?

…衆ロ難τιáo~ 提交于 2020-01-23 01:05:11
如题, x86_64处理器的指针赋值是原子操作吗? 说实话我很讨厌参与讨论那些似乎不确定东西,倒不是说我对未知不敬畏,而是参与讨论的人大多数都是似懂非懂,对,我说的不确定性指的是参与讨论的人的认知的不确定,如果你自己都似懂非懂,那么我说什么你都可以反驳我,说些 “貌似,可能,并不绝对” 的词汇来让事情变得混乱。 最近写了一篇文章: https://blog.csdn.net/dog250/article/details/103911008 里面提到了一句: 然后有人提出了质疑,其实我这句话后面还有个引用呢: 后面还夹杂了我的评价。 所以说,我的意思是, 以Intel的手册为准。 我觉得我应该收回上面的那句 “which is a pointer assignment operation, on the x86_64 platform which is an atomic operation.” 然后重新说出个所以然来。 那么,我们就看看Intel的手册怎么说: https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf 有了这段 权威描述 ,本文似乎该结束了。 但是…

什么“取消引用”指针意味着什么?

梦想的初衷 提交于 2020-01-23 01:00:03
请提供一个解释示例。 #1楼 指针是值的“引用”..很像库函数是对书的引用。 “解除引用”电话号码实际上正在通过并检索该书。 < c ode>int a=4 ; int *pA = &a ; printf( "The REFERENCE/call number for the variable `a` is %p\n", pA ) ; // The * causes pA to DEREFERENCE ... `a` via "callnumber" `pA`. printf( "%d\n", *pA ) ; // prints 4.. 如果这本书不在那里,图书管理员就会开始大喊大叫,关闭图书馆,并且有几个人会调查一个人去寻找一本不存在的书的原因。 #2楼 简单来说,解除引用意味着从该指针指向的某个内存位置访问该值。 #3楼 我认为之前的所有答案都是错误的,因为它们声明解除引用意味着访问实际值。 维基百科提供了正确的定义: https : //en.wikipedia.org/wiki/Dereference_operator 它对指针变量进行操作,并返回一个等于指针地址值的l值。 这称为“解除引用”指针。 也就是说,我们可以取消引用指针而无需访问它指向的值。 例如: char *p = NULL; *p; 我们取消引用NULL指针而不访问其值。 或者我们可以这样做: p1 = &

剑指offer3.4-代码的鲁棒性

限于喜欢 提交于 2020-01-23 00:22:14
题目 输入一个链表,输出该链表中倒数第k个结点。 思路 1.首先想到的是走到链表的尾端,再由尾端回溯k步。可是链表的节点定义看出这是单向链表,结点只有从前往后的指针,因此不能这样走。 2.只能从头节点开始遍历链表。那么我们可以先获取链表的结点数,就可以计算从前往后是需要走多少步了。但是这样需要遍历两次链表 3.为了实现只遍历一次链表,我们还是像之前翻转数组一样,设立两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针始终指向头结点。当第一个指针指向k个结点的时候,两个指针同时向前遍历,这样确保两个指针距离为k。那么当第一个指针指向末尾结点时,第二个指针指向的就是倒数第k个结点。 4.并且需要注意潜在崩溃的风险。当输入的head为空指针时,代码会试图访问空指针的内存空间;输入的链表结点数小于k,for循环中会在链表上向前走k-1步,同样会造成空指针;当k是unsigned int型时,输入的参数k为0,此时for循环的k得到的不是-1,而是0xFFFFFFFF(4294967295),执行次数会非常非常大,造成程序崩溃。 解法 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution {

思考题2

主宰稳场 提交于 2020-01-22 22:02:23
题目链接 思考题:C语言哪里不安全,不严谨? 首先,C语言在编译过程中不对数组下标的边界做检查,所以即使出现了下标越界的问题,C语言也不会报错。由于越界内存的内容未知,就可能造成数据的丢失或者混乱,所以数据的安全性降低了。 还有指针的使用。如果指针是个野指针,也会指向未知的内存,如果对野指针进行数据的操作也可能造成数据的丢失和奇怪数据的输出。 有时候因为数组不够大和输入函数的使用的问题,字符型数组中没有‘\0’,但是依然不会报错,输出的时候就可能产生无限输出的问题,所以不够严谨。 来源: https://www.cnblogs.com/CCchaos/p/12229689.html