sizeof

C++ Primer Answer ch04

自作多情 提交于 2020-02-28 03:18:02
4.1 #include <iostream> using namespace std; int main() { cout << 5 + 10 * 20 / 2;//105 return 0; } 4.2 #include <iostream> #include <vector> using namespace std; int main() { vector<int> vec = {1, 3, 5}; cout << *vec.begin() << ' '; cout << *(vec.begin()) << ' '; cout << *vec.begin() + 1 << ' '; cout << (*(vec.begin())) + 1; return 0; } 4.3 可以。操作数的求解顺序通常对结果没什么影响,只有当二元操作符的两个操作数涉及同一对象,并改变对象的值时,操作数的求解顺序才会影响计算结果。实现效率的提高能使使用编译器的程序受益。 4.4 #include <iostream> using namespace std; int main() { cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;//91 return 0; } 4.5 #include <iostream> using namespace std; int

c++ sizeof对象大小整理

时间秒杀一切 提交于 2020-02-28 00:57:43
1. sizeof 是运算符,而不是函数。 2. 当sizeof 的对象是表达式时,求的大小是表达式返回值的类型大小,但并不计算表达式的值,比如: 1 char c = 1; 2 int i = 2; 3 cout << sizeof(c + i) << endl; 4 cout << sizeof(c = c + i) << endl; 前者c + i会隐式类型转化为int类型(类型提升),因此返回4(32位系统), 而后者虽然运算时也是转化为int,但赋值给c时又会转化为char,因此返回的是1。 3. 如果对象是函数,则返回函数返回值类型大小,如: 1 long long foo() 2 { 3 cout << "foo() has been called" << endl; 4 return 0; 5 } 6 7 int main(int argc, char **argv) 8 { 9 cout << sizeof(foo()) << endl; 10 return 0; 11 } 执行后输出8, 不会输出 foo() has been called.说明函数没有真正执行,而只是判断了下返回类型。 4. 当sizeof的对象是数组时,返回 数组总大小 ,而当对象是指针时,返回 指针本身的大小 ,而不是指示内存空间的大小。因为指针本身就是一个无符号整型数, 因此int *p

C语言变量

谁说胖子不能爱 提交于 2020-02-27 15:18:18
C语言变量 任何一种编程语言都离不开变量,特别是数据处理型程序,变量的使用非常频繁,没有变量参与程序甚至无法编制,即使编制运行后的意义也不大。变量之所以重要,是因为变量是编程语言中数据的符号标识和载体。 C语言是一种应用广泛的善于实现控制的语言,变量在C语言中的应用更是灵活多变。那么变量究竟是什么呢?变量是内存或寄存器中用一个标识符命名的存储单元,可以用来存储一个特定类型的数据,并且数据的值在程序运行过程中可以进行修改。可见,变量首先是一个标识符或者名称,就像一个客房的编号一样,有了这个编号我们在交流中就可方便言表,否则,我们只可意会,那多不方便。为了方便,我们在给变量命名时,最好能符合大多数人的习惯,基本可以望名知义,便于交流和维护;其次,变量是唯一确定的对应内存若干存储单元或者某个寄存器。这些是编译器来保证的,用户一般不用费心。 程序员一旦定义了变量,那么,变量就至少可为我们提供两个信息:一是变量的地址,即就是,操作系统为变量在内存中分配的若干内存的首地址;二是变量的值,也就是,变量在内存中所分配的那些内存单元中所存放的数据。 由于程序的多样需要,我们对变量也有各种各样的要求,比如:变量的生命期,变量的初始状态,变量的有效区域,变量的开辟地和变量的开辟区域的大小等等;为了满足这些要求,C语言的发明者就设置了以下变量: 1、 不同数据类型的变量;如:char cHar, int

《C语言》—— 数组

馋奶兔 提交于 2020-02-27 03:45:24
书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗。——高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!! 前言  我本来准备C语言章节就写个指针就ok了,在我看来C语言的精华部分就是指针了。但是有很多同学就开始在群里各种拉扯C语言的其他问题,没办法,我是龙叔嘛,想想还是整理一下,把一些重要的C语言知识点都一一更新了吧。C语言指针的内容请点击 指针(上) 和 指针(下) , 记得点关注,不迷路 数组的基本概念  我们把一组数据的集合称为 数组(Array) ,它所包含的每一个数据叫做 数组元素 (Element),所包含的数据的个数称为 数组长度 (Length),数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为 下标 (Index),所包含数组的里面元素的类型叫做 数组类型 (Type)。  一句话就说清楚了数组的基本概念,就是这么简单,^_^。 数组底层结构探析 1int array[5]; 内存布局图  不要看这个图简单,底层就是这样的。数组是一个整体,它的内存是 连续 的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。   这一点很重要,连续的内存为 指针 操作(通过指针来访问数组元素)和内存处理

为什么sizeof(x ++)不增加x?

╄→尐↘猪︶ㄣ 提交于 2020-02-26 23:36:15
这是在dev c ++窗口中编译的代码: #include <stdio.h> int main() { int x = 5; printf("%d and ", sizeof(x++)); // note 1 printf("%d\n", x); // note 2 return 0; } 我希望在执行 注释1 后 x 为6。 但是,输出为: 4 and 5 谁能解释为什么 音符1 之后 x 不会增加? #1楼 sizeof() 运算符仅给出数据类型的大小,它不评估内部元素。 #2楼 注意 此答案是从重复副本中合并而成的,这解释了延迟日期。 原版的 除了 可变长度数组, sizeof 不会评估其参数。 我们可以从C99标准草案第 6.5.3.4 节 “ sizeof运算符 第 2 段”中看到这一点: sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的括号名称。 大小由操作数的类型确定。 结果是一个整数。 如果操作数的类型是可变长度数组类型,则对操作数求值; 否则,不评估操作数,结果为整数常量。 一个注释( 现已删除 )询问这样的事情是否会在运行时评估: sizeof( char[x++] ) ; 确实可以,像这样的东西也可以工作( 看到他们两个都活着 ): sizeof( char[func()] ) ; 因为它们都是可变长度数组。 虽然

LeetCode周赛-177

我只是一个虾纸丫 提交于 2020-02-26 14:30:06
1.日期之间隔几天 【思路】计算两个日期和1970-1-1之间相隔的天数,然后相减即可。需要注意闰年闰月的判断。 int getday(int *d1){ int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int day1=0,i; for(i=1970;i<d1[0];i++){ if(i%400==0||(i%100!=0&&i%4==0)){ day1+=366; }else{ day1+=365; } } for(i=1;i<d1[1];i++){ day1+=month[i-1]; if(i==2){ if(d1[0]%400==0||(d1[0]%4==0&&d1[0]%100!=0)){ day1++; } } } day1+=d1[2]; return day1; } int* getdate(char * date){ int i,len,top=0; int *num=(int*)malloc(sizeof(int)*3); // memset(num,0,sizeof(num)); num[0]=0;num[1]=0;num[2]=0; len=strlen(date); for(i=0;i<len;i++){ if(date[i]=='-'){ top++;continue; } num[top]

《C语言》 —— 数组详解

久未见 提交于 2020-02-26 03:05:41
书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗。——高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 前言  我本来准备C语言章节就写个指针就ok了,在我看来C语言的精华部分就是指针了。但是有很多同学就开始在群里各种拉扯C语言的其他问题,没办法,我是龙叔嘛,想想还是整理一下,把一些重要的C语言知识点都一一更新了吧。C语言指针的内容请点击 指针(上) 和 指针(下) , 记得点关注,不迷路 数组的基本概念  我们把一组数据的集合称为 数组(Array) ,它所包含的每一个数据叫做 数组元素 (Element),所包含的数据的个数称为 数组长度 (Length),数组中的每个元素都有一个序号,这个序号从0开始,而不是从我们熟悉的1开始,称为 下标 (Index),所包含数组的里面元素的类型叫做 数组类型 (Type)。  一句话就说清楚了数组的基本概念,就是这么简单,^_^。 数组底层结构探析 int array[5]; 内存布局图  不要看这个图简单,底层就是这样的。数组是一个整体,它的内存是 连续 的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。   这一点很重要,连续的内存为 指针 操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等

链表逆置合集

 ̄綄美尐妖づ 提交于 2020-02-26 02:51:19
链表逆置 #include<bits/stdc++.h> using namespace std; struct LNode { int data; LNode *next; }; void creathead(LNode *&L,int a[],int n)///尾插法 { LNode *r,*s; L=(LNode*)malloc(sizeof(LNode)); L->next=NULL; r=L; for(int i=0; i<n; i++) { s=(LNode*)malloc(sizeof(LNode)); s->data=a[i]; r->next=s; r=r->next; } r->next=NULL; } void reverse(LNode *&L) { LNode *p,*q; p=L->next; L->next=NULL; while(p!=NULL) { q=p; p=p->next; q->next=L->next; L->next=q; } } int main() { LNode *L,*B; int n,c[10000]; scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&c[i]); creathead(L,c,n); reverse(L); while(L->next!=NULL) {

I/O多路复用select/poll/epoll

Deadly 提交于 2020-02-25 19:52:32
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个。因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll。现代操作系统中,线程数已经得到了极大的提升,如NPTL线程软件包可支持数十万的线程。 I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型

Delphi指针长度

空扰寡人 提交于 2020-02-25 10:35:34
要点: 1.指针指向的内容的大小因数据类型的不同而不同,指针本事的大小,都是4字节 2.sizeof函数是取形参所占的内存大小 3.IntToHex是把整数型的值,转换为16进制的值,第二个参数是16进制的长度为多少位 program MyPoint; //指针详解 {$APPTYPE CONSOLE} uses SysUtils,windows,Generics.Collections ; {指针长度} procedure MyFunc3(); var MyInt : Integer;//整数 MyPoint : PInteger; //定义指针 MyByte : Byte; MyPintByte : PByte; begin MyInt := 2; MyByte := 3; {byte型和integer型的指针} MyPoint := @MyInt; MyPintByte := @MyByte; {输出2者地址} Writeln('MyPoint :' + IntToHex(Integer((MyPoint)),8)); Writeln('MyPintByte :' + IntToHex(Integer((MyPintByte)),8)); Inc(MyPoint); Inc(MyPintByte); {调用Inc之后byte和integer地址一个多1,一个多4}