sizeof

C语言第三周

跟風遠走 提交于 2020-02-08 00:58:54
一. 字符串常量 只要有一对双引号括起来的字符序列就是字符串常量。列如“hello"接”123" 注意: “a"是字符串常量‘a'是字符常量。 二、字符串储存 字符串的结束标志是‘\0’。 列如: char str[6]={'h',‘e','l','l','o','0','\0'}; 三、学习过程中遇到的问题与解决 1、C语言中,为什么字符串可以赋值给字符指针变量? char *p,a='5'; p=&a; //显然是正确的, p="abcd" //但为什么也可以这样赋值? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,网上查资料学习了一下 答: 双引号做了3件事 : 1.申请了空间(在常量区),存放了字符串 2.在字符串尾加上了'/0' 3.返回地址 这里就是 返回的地址 赋值给了 p 二、char *p = “hello”; 上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了 解释: 字符串常量"hello"出现在一个表达式中时,"hello"表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。 所以,可以把字符串赋值给指向字符的指针p,而不能把字符串赋值给一个字符数组。 char a[10] = “hello”; //这样可以,这种情况是c语言初始化所支持的 如果写成char a[10] 然后 a = “hello” 这样就错误了。

[C语言]指针与字符串

随声附和 提交于 2020-02-07 20:49:53
----------------------------------------------------------------------------- // main.c // Created by weichen on 15/2/1. // Copyright (c) 2015年 weichen. All rights reserved. #include <stdio.h> int main(int argc, const char * argv[]) { /*   取地址与获取大小:   1. 运算符sizeof可以给出某个类型或变量在内存中的字节数 2. scanf("%d", &a);里面的&为运算符;&用于获取变量的地址,其操作数必须是变量 3. &不能对没有的东西取地址,如:&(a++),&(++a);取地址符右边必须有一个变量   */ int a = 0; int b = (int)&a; //将a的地址强制类型转换为整型 printf("sizeof(a)=%ld\n", sizeof(a)); //4 printf("sizeof(int)=%ld\n", sizeof(int)); //4 //4. double变量在内存中占据的空间是int变量的两倍 //5. 地址的大小是否与int相同取决于编译器,取决于是32位还是64位架构,并不总是相同

2020 HZNU Winter Training Day 10

只谈情不闲聊 提交于 2020-02-07 17:13:01
B CodeForces 1091D 题意:给n!个n的排列,按字典序从小到大连成一条序列,例如3的情况为:[1,2,3, 1,3,2, 2,1,3 ,2,3,1 ,3,1,2 ,3,2,1],问其中长度为n,且和为sum=n*(n+1)/2的序列有多少个? 思路:我们考虑一下next_perumation函数产生字典序递增的全排列的过程: 假设某一个序列长度为n,最长的递减的后缀长度k,那么它的下一个排列是这样产生的:选取序列第n-k个数,与后k个数中比第n - k个数大的最小的数交换,然后将后k个数按从小到大排序。 例如序列1,2,5,4,3的下一个排列为1,3,2,4,5。我们观察发现:这种时候1,2,(5,4,3,1,3,)2,4,5不满足和为sum了,因为在产生下一个排列的过程中,第n-k个位置的数被替换了。 也就是说,假设一个序列存在长度为k的递减后缀,那么这个后缀不能产生一个长度为sum的序列。例如,1,2,(5,4,3,1,3,)2,4,5不行,但是1,(2,5,4,3,1,)3,2,4,5可以。 所以,我们的任务是找出每个长度为k的递减后缀有多少个?应该为C(n,n-k)*(n-k)!=A(n,n-k)=n!/k!个。因为只要选了前面n-k个数,后面长度为k的递减的序列是固定的,所以我们只需要选n-k个数全排列就行了。 我们可以得到最终的答案了:一共有n*n!-

二分图

戏子无情 提交于 2020-02-06 02:53:36
二分图,首先第一点什么是二分图: 把一个图的顶点划分为两个不相交集 U 和V ,使得每一条边都分别连接U、V中的顶点。如果存在这样的划分,则此图为一个二分图。比方说下图就是一个二分图。 ​ 那么首先第一点我们要判读一个图是否为二分图,可以采用染色的思想。对于相邻的节点然不同的颜色,然后递归在这棵树上找。我们可以申明一个color数组,int color[maxn],0代表白色,1代表黑色。对于相邻的染不同的颜色,也就是color[i]=(!color[from]);那么按照我们的定义二分图点集内不能有连线,那么如果出现起点和终点的颜色相同,那么就说明这个点集内有某条连线,也就是if(ma[from][i]&&color[from]==color[i]) return 0; int bfs() { queue<int>q; q.push(1); color[1]=1; while(!q.empty()) { int from=q.front(); q.pop(); for(int i=1;i<=n;i++) { if(color[i]==-1&&ma[from][i]) { q.push(i); color[i]=(!color[from]); } if(ma[from][i]&&color[from]==color[i]) return 0; } } return 1; }

c++学习笔记(七)

夙愿已清 提交于 2020-02-05 21:28:37
位运算和sizeof运算符 位运算 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的。 位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。 位运算主要有6种:与(&),或(|),取反(~),异或(^),左移(<<),右移(>>)。 位运算符满足左结合律且优先级如下:比算术运算符优先级低,比关系运算符、条件运算符和赋值运算符优先级高。 因此一次使用多个运算符的时候应该在适当的地方加上括号。 sizeof运算符 sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。 sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。 使用sizeof的语法: sizeof (data type) 其中,data type 是要计算大小的数据类型,包括类、结构、共用体和其他用户自定义数据类型。 sizeof expr 在第二种形式中,sizeof返回的是表达式结果类型的大小,并不实际计算其运算对象的值。 注意: 1.定义一个空的类型,里面没有任何成员变量和成员函数,对该类型求sizeof,所求结果为1。 2.对char或者类型为char的表达式执行sizeof运算,结果得1。 3.3.运算符优先级总结:算术>关系>逻辑>条件>赋值>逗号。 来源: https://www.cnblogs

牛客网 —— 腾讯2017校招开发工程师笔试试卷(二)

落花浮王杯 提交于 2020-02-05 20:31:19
链接: https://www.nowcoder.com/test/6393508/summary 第一题:Linux进程通信方式: 套接字(网络通信),信号量,管道(PIPE),共享内存,FIFO(命名管道),信号(signal),文件锁。 第二题: 区分数组指针和指针数组: 数组指针:int *p[4]; 从右往左理解,因为[4],所以是一个数组,然后是int*,说明内部的元素是4个int指针。 (中文名字本质在左边,看代码本质在右边) 指针数组:int (*p)[4]; 因为有括号,所以说明它是一个指针,然后再从右往左理解。 (其实,最正规的理解是看运算符的优先级, [] > *) 因为本题本指针数组,所以该指针指向的数组每个元素都是长度为4的数组。m为{{1,2,3,4},{5,6,7,8},{9,0, , }}。 第三题:银行家算法用于避免死锁。 (有关于死锁的部分,概念可以完全去学习一下) 第七题:待会再学。 第12题:64位系统,32位系统:CPU一次处理的位数,寄存器的位数也和这个位数一致。 对于MAR,他也是一个寄存器,因此CPU处理字长决定了虚拟地址的长度,因此,指针的长度也会因此改变,在64位系统中为8B,在32位系统中为4B。 (因此,对于32位系统的计算机而言,超过4G的内存就没有必要了。) 第13题:空类求sizeof为1

网络流小结

╄→尐↘猪︶ㄣ 提交于 2020-02-05 06:53:10
网络流主要包括: 1、最大流 2、费用流 3、有上下界的网络流 网络流的基本技巧: 1、多个源点和汇点的情况。建立超级源点和超级汇点。 2、顶点有容量限制。拆成两个点,此两点连边,容量为原来的点被限制的容量。 3、最大费用转为最小费用。变负数,最后变回来。 一、最大流 最大流算法的思想是不断地找 S 到 T 的增广路。算法的效率是由找增广路的方法决定的。 Edmond - Karp 算法:用广搜找增广路,时间复杂度 O (n*m*m ) 。思路最简单。 1 const int N=110, INF=0x3f3f3f3f; 2 int Map[N][N],pre[N],n,ans; 3 bool vis[N]; 4 queue<int> que; 5 bool EK_bfs(int s,int e) 6 { 7 int i,k; 8 while(!que.empty()) que.pop(); 9 memset(vis,0,sizeof(vis)); 10 memset(pre,0,sizeof(pre)); 11 que.push(s); 12 vis[s]=1; 13 while(!que.empty()) 14 { 15 k=que.front(); 16 if(e==k) return 1; 17 que.pop(); 18 for(i=1;i<=n;i++) 19 { 20

socketopt 函数

我是研究僧i 提交于 2020-02-05 05:24:39
本文转载链接: https://www.cnblogs.com/Ansing/p/5915538.html 功能描述: 获取或者设置与某个套接字关联的选 项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位 于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须 给出。例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP。 用法: #include <sys/types.h> #include <sys/socket.h> int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen); 参数: sock:将要被设置或者获取选项的套接字。 level:选项所在的协议层。 optname:需要访问的选项名。 optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。 optlen:对于getsockopt()

在C#中利用Keep-Alive处理Socket网络异常断开的方法

北慕城南 提交于 2020-02-05 05:03:28
  最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接。服务端采用C#开发,客户端采用Delphi开发。在服务端开发中我碰到了各种各样的网络异常断开现象。在处理这些异常的时候有了一些心得,现在写出来和大家分享一下。 那网络异常断开原因主要有那些呢?归纳起来主要有以下两种: 1、客户端程序异常。   对于这种情况,我们很好处理,因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常(就是WinSock2中的10054异常)。只要在服务端处理这个异常就可以了。 2、网络链路异常。   如:网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。这样的话上面的代码就不能处理这种情况了。对于这种情况在MSDN里面是这样处理的,我在这里贴出MSDN的原文: 如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。    但是我在实际应用中发现,MSDN说的这种处理方法在很多时候根本无效,无法检测出网络已经异常断开了。那我们该怎么办呢?   我们知道,TCP有一个连接检测机制,就是如果在指定的时间内(一般为2个小时)没有数据传送,会给对端发送一个Keep-Alive数据报

linux高级编程day10 笔记

妖精的绣舞 提交于 2020-02-04 20:10:32
一.TCP的编程模型 回顾: UDP模型的UML图 TCP模型的UML图 案例1: TCP的服务器(在案例中使用浏览器作为客户程序) socket建立服务器的文件描述符号缓冲 bind把IP地址与端口设置到文件描述符号中 listen负责根据客户连接的不同IP与端口,负责生成对应的文件描述符号及其信息 accept一旦listen有新的描述符号产生就返回,否则阻塞。 View Code //tcpserver.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> main() { int serverfd; int cfd; int a; struct sockaddr_in sadr; struct sockaddr_in cadr; socklen_t len; int r; char buf[1024]; //1.socket serverfd=socket(AF_INET,SOCK_STREAM,0); if(serverfd==-1) printf("1:%m\n"),exit(-1); printf(