指针

C++之typedef 小记

£可爱£侵袭症+ 提交于 2021-01-14 06:13:15
 以前曾不知道为何要用typedef,随着开发的深入,真正感受到了其内涵所在: 1.如:typedef int DataType 接下来项目中的几万行代码中,如果需要将所有的DataType改为float型,如果不用typedef工作量可想而知的;从而起到了精简代码的作用; 2.如下: typedef struc DataStru{ ........ ........ }MydataStru,*pMydataStru; 当你再定义数据结构时,如果是结构体,直接MydataStru就OK; 如果是结构体指针,直接pMydataStru就OK; 是不是简化你的程序了;其他过去赘余的例子不再举了,重在用心领悟; 哲学感悟:C++蕴含了太多的 哲学,存在就有其合理性 来源: oschina 链接: https://my.oschina.net/u/2344808/blog/397848

GoLang 强制类型转换:unsafe.Pointer

天涯浪子 提交于 2020-04-20 07:08:59
注意此种转换只适合简单类型,对于有对象描述的类型是完全不适用的,鸡肋啊 更详细的文章请参见@陈一回 http://my.oschina.net/goal/blog/193698 ps:补充另外一种用法,这次就不鸡肋了 Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。 指针也是具有明确类型的对象,进行严格类型检查。下面的代码会产生编译错误 package main import ( "fmt" ) func main() { u := uint32(32) i := int32(1) fmt.Println(&u, &i) // 打印出地址 p := &i // p 的类型是 *int32 p = &u // &u的类型是 *uint32,于 p 的类型不同,不能赋值 p = (*int32)(&u) // 这种类型转换语法也是无效的 fmt.Println(p) } unsafe 包提供的Pointer方法可以完成这个任务 package main import ( "fmt" "unsafe" ) func main() { u := uint32(32) i := int32(1) fmt.Println(&u, &i) p := &i p = (*int32)(&u) p = (*int32)(unsafe.Pointer(&u)) fmt

指针的简单理解

心已入冬 提交于 2020-04-14 03:24:38
【今日推荐】:为什么一到面试就懵逼!>>> ##一、指针概述 ###1.指针是什么? 简单来说,指针是一个地址,其指向存储某一个数据的存储地址。 一个变量的指针就是这个变量的地址。存放地址的变量,就是指针变量。 ###2.定义指针 存储类型名 数据类型 *指针变量名 如 int *p; p即为指针变量。 把指针变量指向的变量的数据结构称为指针的数据类型,而任何一个指针变量本身数据值的类型都是unsigned long int。 ###3.指针的初始化 用地址量初始化指针变量。 ##二、指针的运算 ###1.取地址与取值运算 &运算符:为取地址运算符,&x的值为x的地址 *运算符:指针运算符或指向运算符也称间接运算符 对于指针px: px -- 指针变量,它的内容是地址量。 *px -- 指针的目标变量,它的内容是数据。 &px -- 指针变量占用的存储区域的地址。 例: #include<iostream> using namespace std; int main() { int a = 1; int *p; p = &a; cout << "p =" << "\t" << p << endl; //p = 0018F800 cout << "*p =" << "\t" << *p << endl; //*p = 1 cout << "&p =" << "\t" << &p <<

深入malloc() 和free()

拟墨画扇 提交于 2020-04-07 13:17:49
一、malloc()和free()的基本概念以及基本用法: 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该有多种,比如说空间不足就是一种。 void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 2、函数的用法: 其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子: // Code... char *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); if (NULL == Ptr) { exit (1); } gets(Ptr); // code... free(Ptr); Ptr = NULL; // code... 就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。 3、关于函数使用需要注意的一些地方: A、申请了内存空间后, 必须检查 是否分配成功。 B

80C51存储器与C51内存优化

一个人想着一个人 提交于 2020-04-07 12:13:32
80C51在物理结构上有四个存储空间:片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。但在逻辑上,即从用户使用的角度上,80C51有三个存储空间:片内外统一编址的64KB的程序存储器地址空间(用16位地址)、256B的片内数据存储器的地址空间(用8位地址,其中128B的专用寄存器地址空间仅有21个字节有实际意义)以及64KB片外存储器地址空间。 1、程序存储器 程序存储器用于存放编好的程序和表格常数。80C51片内有4KB ROM,片外16位地址线最多可扩展64KB ROM,两者是统一编址的。如果EA端保持高电平,80C51的程序计数器PC在0000H——0FFFH范围内(即前4KB地址)是执行片内ROM的程序。当寻址范围在1000H——FFFFH时,则从片外存储器取指令。当EA端保持低电平时,80C51的所有取指令操作均在片外程序存储器中进行,这时片外存储器可以从0000H开始编址。 程序存储器中,以下6个单元具有特殊功能。 0000H:80C51复位后,PC=0000H,即程序从0000H开始执行指令。 0003H:外部中断0入口。 000BH:定时器0溢出中断入口。 0013H:外部中断1入口。 001BH:定时器1溢出中断入口。 0023H:串行口中断入口。 2、数据存储器 数据存储器用于存放中间运算结果、数据暂存和缓冲、标志位等。80C51片内有256B

对象访问定位

ぐ巨炮叔叔 提交于 2020-04-07 00:45:52
句柄访问 jvm栈中的引用类型指向java堆里的句柄池,句柄池指针分别指向对象实例和类型;好处是:引用类型指针永远指向句柄池地址,新的对象创建的时候只是句柄池指针有变化而已; 直接指针访问 引用类型直接指向对象实例,对象头的类型指针指向方法区里的类型文件(class文件);好处是寻找对象非常快 来源: oschina 链接: https://my.oschina.net/u/1792430/blog/667843

【LeetCode-数组】删除排序数组中的重复项

六眼飞鱼酱① 提交于 2020-04-06 23:59:54
题目描述 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 题目链接: https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 思路 做这题之前可以先做一下 移除元素 。使用一快一慢两个指针,i为慢指针,j为快指针,都从数组头开始遍历。如果nums[i]==nums[j],则j++,继续遍历下一个元素。如果nums[i]!=nums[j],则说明找到了不同的元素,因为重复的元素要保留一个,所以先将i+1后赋值,也就是nums[++i]=nums[j],当j遍历完毕时,当前数组的长度为i+1.代码如下: class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.empty()) return 0; int i=0, j=0; int curLen

网友:c++与Python,究竟谁才是大哥?

拥有回忆 提交于 2020-04-06 16:46:21
一直以来,在 TIOBE 编程语言排行榜中,简单易用的新贵 Python 和老将 C++ 是强劲的竞争对手,不过 C++ 和 Python 都是非常流行的编程语言,对于开发者而言,在选择语言利器时究竟有何参考标准?本文将基于两种语言的关键性能对比,带领大家深入不一样的 Python 与 C++。 在编程生涯的早期阶段,我参与过一款C++数学优化应用程序的开发,这个程序对性能的要求很高。至今我依然记得那段艰难的经历。 在那个项目中,我遇到了一些概念,比如指针、并发和垃圾回收,刚开始的时候这些概念非常难以理解。 然而,如果你问我对C++的看法,那么我会很高兴地向想要构建实时应用程序的人推荐C++。 C++是一门非常强大的编程语言。 很多小伙伴在学习Python的过程中往往因为没有资料或者没人指导从而导致自己不想学下去了,因此我特意准备了大量的PDF书籍、视频教程,都免费送给大家!不管你是零基础还是有基础都可以获取到自己相对应的学习礼包!包括Python软件工具和2019最新入门到实战教程,(https://url.cn/59RWE1Z)复制到浏览器打开! 最近,我一直在从事有关机器学习和数据科学解决方案的架构和实现工作。我选择的语言是Python。我承认也很欣赏这种语言的简单性和强大性。有些程序员认为Python是一种原型编程语言,当然他们有自己的正当理由。但是

对象的访问定位

那年仲夏 提交于 2020-04-06 12:34:28
主流的有两种方式:使用句柄、直接指针。具体的取决于虚拟机实现 各有优势。 使用句柄:在GC垃圾回收中,整理移动对象时,不需要修改对象数据中的指针内容。只要改变 reference 的指针地址 直接指针:节省一次指针定位的时间。因此访问对象是相当频繁的,积少成多。 对象的内存分布: 对象头。主要保存:运行时数据,比如:哈希吗,GC分代年龄等。如果是 直接指针 方式,还会保存 类型指针 实例化数据:无论是从父类继承的还是本身的都保存在这 对齐填充:占位符,由于要求对象大小是8字节倍数,因此这里作为填充 小结:对象的类型指针并不要求保存在对象数据中,主要取决于虚拟机的 对象的访问定位 方式 来源: oschina 链接: https://my.oschina.net/u/3870422/blog/3220473

C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存

大兔子大兔子 提交于 2020-04-06 08:36:28
一、malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数。free是进行内存释放的库函数。 1、函数原型 #include <stdlib.h> void *malloc( size_t size ); void free( void* memblock ); 2、返回值 成功时,返回所分配存储空间的起始地址;返回值类型为void*,在C语言中可以把void*直接付给具体的类型,但是在C++中必须进行强制类型转换 失败时(内存不足时)返回NULL size为0时,返回的指针不是NULL;但是除了free,别的地方不要使用这个指针。 3、使用示例 #include <stdlib.h> /* For _MAX_PATH definition */ #include <stdio.h> #include <malloc.h> void main( void ) { char *string; /* Allocate space for a path name */ string = malloc( _MAX_PATH ); // In a C++ file, explicitly cast malloc's return. For example, // string = (char *)malloc( _MAX_PATH ); if(