指针数组

数组初始

岁酱吖の 提交于 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' )

写入和读取float型数据

我怕爱的太早我们不能终老 提交于 2020-01-10 10:16:32
一、目的 写入和读取float数据 二、环境 开发工具:DEV-C++ 三、方法 傻瓜式方法 假如存储1.234,那么先把1.234*1000=1234,将1234存到存储器中。读取出来的时候,再将1234/1000=1.234,这个方法很简答易懂,但是精度不高。 byte数组与指针 关键:一是数据以二进制的形式存储;二是简单应用数组和指针。 接下来直接上代码: unsigned char a[4]; unsigned char i; unsigned char *P,*PX; float b1 = 1.123,b2; void *Fl; //不确定类型指针 printf("b1=%f\n\n", b1); //float转到byte数组 P = (unsigned char*)&b1; //指针指向b1的首地址 for(i=0; i<4; i++) { a[i] = *(P+i); //将四个字节的float数,一个一个字节地存入数组中 printf("a[%d]=%x\n", i,a[i]); } //byte数组转到float Fl = &b2; //指针指向b2的首地址 PX = a; //指针指向数组a[4]的首地址 for(i=0; i<4; i++) { *((unsigned char*)Fl+i) = *(PX + i); //以指针为桥梁,进行赋值 printf

指针数组与指向指针的指针

巧了我就是萌 提交于 2020-01-09 21:56:44
指针数组与指向指针的指针 http://wlkc.gdqy.edu.cn/jpkc/portal/blob?key=173314 指针数组和数组指针的区别 http://allew.blog.163.com/blog/static/3374389720094148449239/ 指针数组[组图] http://school.cnd8.com/c/jiaocheng/9212.htm 函数指针和指针函数 http://lionwq.spaces.eepw.com.cn/articles/article/item/18258 ======================================== source 1 #include <stdio.h> int main(void) { char *ptr[4] = {"beijing", "shanghai", "tianjin", "chongqing"}; int i, *iptr[3], a[3]={1,2,3},b[3][2]={1,2,3,4,5,6}; for(i=0; i<4; i++) printf("%s/t", ptr[i]); printf("/n"); for(i=0; i<3; i++) iptr[i]=&a[i]; for(i=0; i<3; i++) printf("%d/t", *iptr[i]

链表知识总结

岁酱吖の 提交于 2020-01-08 09:34:39
一、什么是链表? 和数组一样,链表也是一种线性表。 从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。 链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。 二、为什么使用链表?即链表的特点 插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(n)级别(需要从链头至链尾进行遍历)。 和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。 三、常用链表:单链表、循环链表和双向链表 1.单链表 每个节点只包含一个指针,即后继指针。 单链表有两个特殊的节点,即首节点和尾节点。为什么特殊?用首节点地址表示整条链表,尾节点的后继指针指向空地址null。 性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。 2.循环链表 除了尾节点的后继指针指向首节点的地址外均与单链表一致。 适用于存储有循环特点的数据,比如约瑟夫问题。 3.双向链表 节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。 首节点的前驱指针prev和尾节点的后继指针均指向空地址。 性能特点: 和单链表相比,存储相同的数据,需要消耗更多的存储空间。 插入、删除操作比单链表效率更高O

深度解密Go语言之map

自作多情 提交于 2020-01-08 08:51:52
目录 什么是 map 为什么要用 map map 的底层如何实现 map 内存模型 创建 map 哈希函数 key 定位过程 map 的两种 get 操作 如何进行扩容 map 的遍历 map 的赋值 map 的删除 map 进阶 可以边遍历边删除吗 key 可以是 float 型吗? 总结 参考资料 这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。 我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门书籍了解。本文的内容比较深入,但是由于我画了各种图,我相信很容易看懂。 什么是 map 维基百科里这样定义 map: In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible key appears at most once in the collection. 简单说明一下:在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 <key, value>

码农找工作之:秒杀算法面试必须掌握的14种模式

ぃ、小莉子 提交于 2020-01-07 20:38:40
对于茫茫多的程序员来说,准备算法面试简直就是一个亚历山大的过程。看不完的学习资料,更惨的是,很多内容和程序员干的事情感觉相去甚远,这无疑只会雪上加霜。 这样的结果之一就是:程序员需要花上数周的时间在诸如LeetCode这样的在线编程平台上准备刷上几百个面试题目。这些焦虑的程序员都关心类似的问题: 我刷了足够的题了吗?我应该再来点吗? 这就是为啥我专注于帮助码农们掌握每个问题背后的模式的原因:这样的话,你们就不需要苦逼哈哈地担心着茫茫多的(一千多道)LeetCode的进度条了,也帮助你们避免盲目刷题的疲劳。如果你理解这些通用的模式,你就可以把他们当做是模板,去解决其他类似的被改头换面过的题目了。 这篇文章就和大家唠唠所有的面试题目可能的14种模式。当然更重要的,我会给大家讲讲怎么去识别每种模式,每个模式再给大家来几个样题尝尝鲜。当然,这些只是冰山一角啦,详细的,不用多说,墙裂推荐你去看这门课: Grokking the Coding Interview: Patterns for Coding Questions 该课程提供详细的理论讲解,例子和编程训练。 如果你需要买该网址的任何课程,都可以使用coupon code: awesome-developer-20 拿到额外八折。 接下来的这些模式是建立在你已经知晓了数据结构的基础之上的。如果你还没掌握的话,嘿嘿,推荐你去看:

Go从入门到放弃(笔记存档)

岁酱吖の 提交于 2020-01-07 00:49:46
前言 考虑到印象笔记以后不续费了,这里转存到博客园一份 因内容是自己写的笔记, 未作任何润色, 所以看着很精简, 请见谅 查看官方文档 在新的go安装包中,为了减小体积默认去除了go doc 安装go语言后在DOS中输入 godoc -http=:9000 然后在浏览器中打开 127.0.0.1:9000 即可(不能关闭DOS) 该系列参照了大佬的学习路线,加上本人的代码实践,大佬链接 https://www.liwenzhou.com/posts/Go/go_menu 目录结构 GOPATH > src 代码(pkg包/bin编译后文件) > 域名 > 用户名 > 项目 > 模块 双引号单引号 单引号代表字符 > 'a' 双引号代表字符串 > "abcd" 中文最少3位所以只能用双引号 编译代码 进入目录(项目) go build -o 文件名 main.go main.go是项目主入口 调试代码 go run 文件 设置生成文件的格式(跨平台) 命令行 // 生成linux可执行文件 SET CGO_ENABLED=0 //禁用CGO SET GOOS=linux //设置目标平台为linux SET GOARCH=amd64 //目标架构为amd64 // 生成win SET GOOS=windows // 生成mac SET GOOS=darwin git控制 只需控制

vector容器的用法

强颜欢笑 提交于 2020-01-05 05:28:00
转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。 (5)使用迭代器访问元素. vector<int>::iterator it; for(it=vec.begin();it!=vec.end();it++) cout<<*it<<endl; (6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a; (7)删除元素: vec.erase(vec.begin()+2);删除第3个元素 vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始 (8)向量大小:vec.size(); (9)清空:vec.clear(); 2 vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码: #include<stdio.h> #include<algorithm> #include<vector> #include<iostream> using namespace

动态内存分配与指向它的指针变量

谁说我不能喝 提交于 2020-01-04 05:49:44
1.动态内存分配的含义   c语言允许建立动态内存分配区域,以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束时才释放,而是要随时开辟,不需要随时释放,这些数据是临时存放在一个特定的自由存储区(堆),可以根据需要向系统申请所需要大小的空间,由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。 2.建立内存的动态分配   对内存的动态分配是通过系统提供的函数库来实现的,主要有malloc,calloc,free,realloc这四个函数: (1).使用malloc函数   其函数原型为void *malloc(unsigned int size);   其作用是在内存的动态存储区域中分配一个长度为size的连续空间,形参size的类型定义为无符号整形(不允许为负数)。次函数的值(即返回值)是所分配区域的第一个字节的地址,或者说,次函数是一个指针型函数,返回的指针指向该分配区域的开头位置,如:   malloc(100)//开辟100字节的临时分配区域,函数值为其第一个字节的地址   注意其指针的基类型为void,即不能执行任何类型的数据,只能提供一个地址,如果此函数未能成功执行(如内存空间不足),则返回空指针。 (2).使用calloc函数   其函数原型为void *calloc(unsigned n,

指针的使用

回眸只為那壹抹淺笑 提交于 2020-01-04 05:49:15
学习链接: http://www.icourse163.org/learn/ZJU-200001?tid=1002316004#/learn/content?type=detail&id=1003086473&cid=1003636045 指针的应用场景 1.交换两个变量 2.函数返回多个值,某些值就只能通过指针返回   传入的参数实际上是需要保存带回的结果的变量 3.函数返回运算的状态,结果通过指针返回 传入函数的数组成了什么? 函数参数表中的数组实际上是指针   sizeof(a)=sizeof(int *) 但是可以用数组的运算符[]进行运算 数组参数 以下四种函数原型是等价的: int sum(int *ar, int n) int sum(int *,int) int sum(int ar[], int n) int sum(int [],int) 数组变量是特殊的指针 数组变量本身表达地址,所以   int a[10]; int *p=a;   但是数组的单元表达的是变量,需要用&取地址   a==&a[0] []运算符可以对数组做也可以对指针做:   p[0]<==>a[0] *运算符可以对指针做,也可以对数组做   *a=25 数组变量是const的指针,所以不能被赋值 int a[] -->int * const a 指针与const 指针是const