指针数组

C语言之结构体

喜你入骨 提交于 2020-02-01 03:56:21
概念 结构体是一种构造类型,由若干个成员组成,成员可以是基本数据类型,或是另一个结构体 声明结构体 struct 结构体名 { 成员列表 }; 结构体名表示结构的类型名。 声明一个结构体表示创建一种新的类型名(自定义数据类型),然后用类型名定义变量。 struct Product { char name[10]; char shape[10]; char color[10]; float price; } 使用结构体定义变量有三种方式 第一种:声明结构体类型,再定义变量 struct Product p1; struct Product p2; p1和p2是结构体变量名,这两个变量具有相同的结构 类比: 类型名 变量名 int a; | | struct Product p; struct Product整体表示一种数据类型 定义结构体变量后,系统会为其分配内存单元 第二种:声明结构体类型时,同时定义变量(可以定义多个变量) struct 结构体名 { 成员列表 } 变量名列表; example: struct Product { char name[10]; char shape[10]; char color[10]; float price; } p1, p2; 第三种:直接定义结构体类型变量(匿名结构体,没有结构体名称) struct { 成员列表 } 成员变量;

指针、数组与sizeof运算符

那年仲夏 提交于 2020-02-01 01:51:37
1、sizeof是C语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返回()里边 的变量或者数据类型占用的内存字节数。 2、sizeof存在的价值: 主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统上为4字节,在16位系统上 为2字节)。所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。 3、举例说明: 例子1:char str[] = "hello"; sizeof(str) //元素所占的字节数,也就是数组的大小 占6个字节 sizeof(str[0]) //第0个元素,第0个元素是char型的,所以 占1个字节 sizeof(str) //字符串的长度(不包含最后的\0), 占5个字节 例子2:char str[] = "hello"; char *p = str;//str做右值,相当于首元素的首地址,数组的元素是char型, //那么str就是char *,刚好匹配 sizeof(p) //p本身是一个指针变量,跟p指向的变量一点关系没有;只是一个char *指针的长度, //32位系统上所有的指针的长度都是4 sizeof(*p) //p所指向的变量,p所指向的变量是char型的,相当于sizeof(char) 自然是1 strlen(p) //相当于strlen

strlen与sizeof区别(转载)

非 Y 不嫁゛ 提交于 2020-02-01 01:49:11
#include "stdio.h" #include "string.h" void main() { char aa[10]; printf("%d",strlen(aa)); printf("%d",sizeof(aa)); } 程序运行得到结果是strlen(aa)=15.sizeof(aa)=10;这是怎么回事呢?strlen是有效字符串的长度,不包含‘\0’,与初始化有关系,而sizeof与初不初始化没有关系。下面我们看看它们的区别吧(以下都是在网上查的) strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,知道遇到'\0'停止。 char aa[10];cout<<strlen(aa)<<endl; //结果是不定的 char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0 char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3 而sizeof()函数返回的是变量声明后所占的内存数,不是实际长度。 sizeof(aa) 返回10 int a[10]; sizeof(a) 返回40 1.sizeof操作符的结果类型是size_t

c++复合类型

别等时光非礼了梦想. 提交于 2020-02-01 01:04:24
1.数组 数组存储同类型的值; 数组使用下标或索引对元素进行标号,从0开始编号; 只能在定义数组时才能使用初始化,此后就不可以了,也不能将一个数组赋给另一个数组; 初始化数组时,提供的值可以少于数组元素的值。如果只对数组的一部分初始化,则编译器将把其他元素设置为0。因此,将数组中所有元素都初始化为0非常简单——只需显式地将第一个元素初始化为0,然后让编译器将其他元素都初始化为0即可:long totals[500] = {0}. 2.字符串   要将字符串存储到数组中,最常用的方法有两种——将数组初始化为字符串常量、将键盘或文件输入读入到数组中。 3.string类 可以使用c-风格字符串来初始化string对象; 可以使用cin来将键盘输入存储到string对象中; 可以使用cout来显示string对象; 可以使用数组表示法来访问存储在string对象中的字符。   c风格的字符串是用数组存放的,一般要以'\0'结束而c++主要以 string类 代替,更加高效,且不易出错   例如:string str = "123";就是c++的风格;char str[4]="123";就是c风格。string是c++中的关键字,和int,float等等一样, 在c++中,string 定义的变量可以直接存储字符串。在C语言中是没有这种直接存储字符串的变量的。   [ ]里面是4,是因为

Power up C++ with the Standard Template Library: Part I[翻译]

隐身守侯 提交于 2020-01-31 12:39:35
Power up C++ with the Standard Template Library: Part I 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=standardTemplateLibrary 】 作者 By DmitryKorolev Topcoder 成员 翻译 农夫三拳@seu Containers Before we begin Vector Pairs Iterators Compiling STL Programs Data manipulation in Vector String Set Map Notice on Map and Set More on algorithms String Streams Summary 也许你已经使用C++作为主要编程语言来解决Topcoder中的问题了,这就意味着你已经在简单的使用 STL了,因为数组和字符串都是以STL对象的方式传入到你的函数中的。也许你已经注意到了,有许多 程序员他们写代码要比你快并且代码也比你的简洁。 也许你不是一个C++程序员,但是因为C++的强大功能以及它的库(或者因为你在Topcoder practice 房间和比赛里面看到的简短的解决方案),你想成为一个这样的程序员。 不管你来自哪里,这篇文章将会帮助你掌握它

Leetcode(中文)笔记

纵饮孤独 提交于 2020-01-31 05:01:09
Leetcode(中文)笔记 最近在刷leetcode,顺便整理一下笔记,用于自我梳理。目前第一遍仅使用Python。 持续更新中。。。 双指针 26.删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 暴力求解: class Solution : def removeDuplicates ( self , nums : List [ int ] ) - > int : i = 0 while i < len ( nums ) - 1 : if nums [ i ] == nums [ i + 1 ] : nums . pop ( i + 1 ) else : i += 1 return len ( nums ) 双指针法: 第一个指针:遍历数组,每遇到nums[j] != nums[i],就说明遇到了新的不同数字,记录之; 第二个指针:每遇到新的不同数字时,执行i += 1, i指针有两个作用:记录数组中不同数字的数量;作为修改数组元素的索引index。 最终,返回i+1即可。 class Solution : def removeDuplicates ( self , nums : List [ int ] ) -

c primer plus 第10章 数组和指针 笔记要点

五迷三道 提交于 2020-01-31 00:44:34
使用const前缀声明数组,可以把数组设置为只读,以便保护数据。 例如: const int powers[3] = {1,2,4}; int sum( const int ar[] , int n); 初始化数组时可以省略方括号里的数字,编译器会根据初始化列表中的项数来确定数组大小。 int powers [] = {1,2,4}; 通过 sizeof days/ sizeof days[0] 可得元素个数 C99 可以初始化指定的数组元素: int arr[6] { [5] = 212 } 使用指针形参 int sump(* int start , * int end ) { {…} while(start < end) {…} } 使用指针时,尽量在声明时进行 初始化 ,防止出现 int *pt; *pt = 5; C99 变长数组(VLA)使用变量表示数组的维度: int q = 4 ; int r = 5; double sales [q][r] ; 声明: 仅用作个人复习 源自博客 一只大鸽子 原文链接:https://blog.csdn.net/qq_41068877/article/details/88163850 来源: CSDN 作者: Chilliming 链接: https://blog.csdn.net/qq_39994598/article

心跳与超时:高并发高性能的时间轮超时器

試著忘記壹切 提交于 2020-01-30 19:59:12
心跳与超时:高并发高性能的时间轮超时器 文章目录 心跳与超时:高并发高性能的时间轮超时器 引言 JDK 原生提供的超时任务支持 java.util.Timer ScheduledThreadPoolExecutor 更高效的数据结构 基本原理 支撑更多超过范围的延迟时间 方案一:不同轮次的延迟任务共存相同的延迟队列 方案二:多层次时间轮 Netty 的时间轮实现 接口定义 构建循环数组 新增延迟任务 工作线程workerThread 线程启动与准备工作 驱动指针和任务触发 时间轮停止 思考总结 引言 在许多业务场景中,我们都会碰到延迟任务,定时任务这种需求。特别的,在网络连接的场景中,常常会出现一些超时控制。由于服务端的连接数量很大,这些超时任务的数量往往也是很庞大的。实现对大量任务的超时管理并不是一个容易的事情。 本章我们将介绍几种用于实现超时任务的数据结构,并且最后分析 Netty 在超时任务上采取的结构和代码。 欢迎加入技术交流群186233599讨论交流,也欢迎关注笔者公众号:风火说。 JDK 原生提供的超时任务支持 java.util.Timer JDK 在 1.3 的时候引入了 Timer 数据结构用于实现定时任务。 Timer 的实现思路比较简单,其内部有两个主要属性: TaskQueue :定时任务抽象类 TimeTask 的列表。 TimerThread

ctypes给扩展模块中的函数传递数组和结构体

大城市里の小女人 提交于 2020-01-30 02:56:27
传递数组 楔子 下面我们来看看如何使用ctypes传递数组,这里我们只讲传递,不讲返回。因为C语言返回数组给python实际上会存在很多问题,比如:返回的数组的内存由谁来管理,不用了之后空间由谁来释放,事实上ctypes内部对于返回数组支持的也不是很好。因此我们一般不会向python返回一个C语言中的数组,因为C语言中的数组传递给python涉及到效率的问题,python中的列表传递直接传递一个引用即可,但是C语言中的数组过来肯定是要拷贝一份的,所以这里我们只讲python如何通过ctypes给扩展模块传递数组,不会介绍扩展模块如何返回数组给python。 如何传递 我们知道python中没有数组,或者说C中的数组在python中是一个list,我们可以通过list来得到数组,方式也很简单。 from ctypes import * # 创建一个数组,假设叫[1, 2, 3, 4, 5] a5 = (c_int * 5)(1, 2, 3, 4, 5) print(a5) # <__main__.c_long_Array_5 object at 0x00000162428968C0> # 上面这种方式就得到了一个数组 # 当然还可以使用list a5 = (c_int * 5)(*range(1, 6)) print(a5) # <__main__.c_long_Array_5

C++ STL之vector用法总结

混江龙づ霸主 提交于 2020-01-30 00:49:38
C++ STL之vector用法总结 介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。 vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward