char函数

ER 和 数据库关系模式

ぐ巨炮叔叔 提交于 2020-02-11 14:54:45
http://lianghuanyue123.blog.163.com/blog/static/130423244201162011850600/ 我们眼下所接触的数据库基本上是关系数据库,关系数据库中的关系模式是型,而关系是值。关系模式是对关系的描写叙述。 什么是关系?关系实质上是一张二维表,当中每一行是一个元组,每一列是一个属性,每一个元组是该关系涉及到属性集合笛卡尔积的一个元素。(笛卡尔积是这种一个集合。集合中的元素是有序对,若 A= { 0,1 } B= { a , b }则: A*B={<0,a> , <0,b>,<1,a>,<1,b>} ) , 关系是元组的集合,所以关系模式要描写叙述元组的集合,当中包含那些属性,属性来自域,属性与域之间的映射关系。 关系模式能够用五元组形式表示: R ( U , D , Dom , F ),当中 R: 表示关系名, U: 表示属性集合, Dom, 表示属性域(来自那个域) ,F: 表示函数依赖。 可是普通情况下,我们通常把关系模式表示为: R ( U )或者 R ( A , B )(当中 A 、 B 代表 U 中的属性) 那么 E-R 图转化成关系模式的步骤。 前提:是已经把需求中的实体,以及实体中联系确定。 第一:把每一个实体都转化成关系模式 R ( A 、 B )形式。( A 、 B 代表属性) 第二

void指针学习

末鹿安然 提交于 2020-02-11 13:38:34
1)可以用任何类型的指针对 void 指针进行赋值   由于void 指针没有特定的类型,因此可以指向任何类型的数据。因此他可以指向任何类型的数据。也就是说,任何类型的指针都可以直接赋值给 void 指针,而无需进行其他相关的强制类型转换。   例如:   double d = 1.54;   void * p = & d; 2)void 指针不可以直接赋值给其它类型的指针   因为 “空类型” 可以包容 “有类型”,而 “ 有类型” 则不能包容 “空类型”。   由此可见,要将 void 指针赋值给其他类型的指针,必须进行强制类型转换。如: 1 void * p1; 2 int * p2; 3 . . . 4 p2 = (int *)p1; 3)避免对 void 指针进行算术操作   ANSI C 标准规定,进行算法操作的指针必须确定知道其指向数据类型大小,也就是说必须知道内存目的地址的确切值。 1 char a[20]="qwertyuiopasdfghjkl"; 2 int *p=(int *)a; 3 p++; 4 printf("%s", p);  // tyuiopasdfghjkl   p++;一步前进了sizeof(int)=4 个字节,而类型为char,sizeof(char)=1   对于 void 指针,编译器并不知道所指对象的大小,所以对 void

ios学习之旅---指针也不难

我们两清 提交于 2020-02-11 12:51:08
1、认识指针 #include <stdio.h> //基本数据类型作为函数參数传递是值传递 //void moveFront(int x ,int y) //{ // x = x + 2; //} void test() { // 确定当前坐标 int x = 20; int y = 150; printf("%p\n",&x); printf("%lu\n",&x); *((int *)(0x7fff5fbff76c)) = 22; printf("(%d,%d)\n",x,y); // moveFront(x, y); // printf("(%d,%d)\n",x,y); } //假设你想訪问指针所指向存储空间,就必须使用訪问指针所指向的存储空间的操作符 void moveFront(int *x ,int *y) { // x = x + 2;//此时是改变指针的指向,而不是訪问指针所指向的存储空间 *x = *x + 2; } int main(int argc, const char * argv[]) { // 确定当前坐标 int x = 20; int y = 150; printf("(%d,%d)\n",x,y); moveFront(&x, &y); printf("(%d,%d)\n",x,y); return 0; } 2、指针的定义与初始化(重点掌握

ios学习之旅---指针也不难

落爺英雄遲暮 提交于 2020-02-11 10:24:41
1、认识指针 #include <stdio.h> //基本数据类型作为函数參数传递是值传递 //void moveFront(int x ,int y) //{ // x = x + 2; //} void test() { // 确定当前坐标 int x = 20; int y = 150; printf("%p\n",&x); printf("%lu\n",&x); *((int *)(0x7fff5fbff76c)) = 22; printf("(%d,%d)\n",x,y); // moveFront(x, y); // printf("(%d,%d)\n",x,y); } //假设你想訪问指针所指向存储空间,就必须使用訪问指针所指向的存储空间的操作符 void moveFront(int *x ,int *y) { // x = x + 2;//此时是改变指针的指向,而不是訪问指针所指向的存储空间 *x = *x + 2; } int main(int argc, const char * argv[]) { // 确定当前坐标 int x = 20; int y = 150; printf("(%d,%d)\n",x,y); moveFront(&x, &y); printf("(%d,%d)\n",x,y); return 0; } 2、指针的定义与初始化(重点掌握

黑马程序员-----结构体数组

别等时光非礼了梦想. 提交于 2020-02-11 07:15:00
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ----- 第一讲 结构体数组 一、结构体数组的概念 数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下表结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。 二、结构数组定义 定义格式: struct 结构名{ 成员表列 }数组名[数组长度]; 例如:定义一个长度为5的数组,其中每一个元素都是stu结构类型。 struct stu{ int num; char *name; char sex; float score; }boy[5]; 定义了一个结构数组boy,共有5个元素,boy[0]~boy[4].每个数组元素都具有struct stu的结构形式。 1 /* 2 结构体数组: 3 4 用来存放大量的结构体相同的结构体变量。 5 6 结构体数组定义: 7 8 结构体数组定义的第一种方式: 9 1.定义结构体的同时,定义数组 10 struct Student{ 11 int age; 12 char *name; 13 int sno; 14 float score; 15

linux文件 IO

拜拜、爱过 提交于 2020-02-11 01:22:36
系统调用: 由操作系统实现并提供给外部应用程序的编程接口,是应用程序同系统之间数据交换的桥梁 open 函数: int open (char* pathname,int flags) #include<unistd.h> 参数: pathname :欲打开的文件路径名 flags :文件的打开方式 : O_RDONLY | O_WRONLY | O_RDWR O_CREAT|O_APPEND(追加)|O_TRUNC(文件清零)|O_EXCL|O_NONBLOCK(设置非阻塞) 返回值: 成功: 打开文件所得到的 对应 文件描述符(整数) 失败: -1 ,设置 errno int open(char* pathname,int flags, mode_t mode) open(pathname,O_RDONLY |O_CREAT ,0664); 参数: pathname:欲打开文件路径名 flags: 文件打开方式: O_RDONLY | O_WRONLY | O_RDWR O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK mode: 参数3使用前提 惨2指定了 O_CREAT 取值8进制数,用来描述文件的访问权限 创建文件的最终权限 mode& ~umask 返回值: 成功: 打开文件所得到的 对应 文件描述符(整数) 失败: -1 ,设置

「C」 数组、字符串、指针

三世轮回 提交于 2020-02-10 23:06:51
一、数组 (一)数组   概念:用来存储一组数据的构造数据类型   特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。 (二)数组的定义   格式: 类型 数组名[元素个数];   举例:存储5个人的年龄   int agrs[5]; // 在内存中开辟4x5=20个字节的存储空间   可以在定义数组的同时对数组进行初始化:   int ages[5] = {17,18,19,20,21};   遍历数组:   for(int i = 0;i<5;i++)   {     printf(“ages[%d]=%d\n”,i,ages[i]);   }   注意:   (1)数组的初始化     ①. int ages[5] = {17,18,19,20,21}; // 一般写法     ②. int ages[5] = {17,18}; // 只对前两个元素赋值     ③. int ages[5] = {[3]=10,[4]=11}; // 对指定的元素赋值,这里为第三个和第四个     ④. int ages[] = {11,12,13}. // 正确,右边的元素确定,则个数可以省略这里为3个。     ⑤. int ages[]; // 错误,编译器无法知道应该分配多少的存储空间     ⑥. int ages[5];ages = {17

nginx开发_字符串操作函数

一笑奈何 提交于 2020-02-10 21:00:47
由于 ngx_str_t 为非NULL结尾的函数,且网络请求中有大量忽略大小写的需求,所以nginx内部封装了许多字符串操作相关的函数,函数名称极其相识,且使用时有有些约定,特此整理。 赋值&拷贝 #define ngx_string(str) { sizeof(str) - 1, (u_char *) str } #define ngx_null_string { 0, NULL } #define ngx_str_set(str, text) (str)->len = sizeof(text) - 1; (str)->data = (u_char *) text #define ngx_str_null(str) (str)->len = 0; (str)->data = NULL //ngx_string与ngx_null_string常用于变量初始化 //ngx_str_set与ngx_str_null常用于变量赋值 #define ngx_memzero(buf, n) (void) memset(buf, 0, n) #define ngx_memset(buf, c, n) (void) memset(buf, c, n) #define ngx_memcpy(dst, src, n) (void) memcpy(dst, src, n) #define ngx

SEED缓冲区溢出实验笔记

陌路散爱 提交于 2020-02-10 20:17:27
缓冲区溢出实验(Linux 32位) 参考教程与材料: http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本文记录了做SEED缓冲区溢出实验的体会与问题,侧重实践,而不是讲解缓冲区溢出原理的详细教程) 1. 准备工作 使用SEED ubuntu虚拟机进行缓冲区溢出实验,首先要关闭一些针对此攻击的防御机制来简化实验。 (1)内存地址随机化(Address Space Randomization):基于Linux的操作系统一般使堆和栈的开始地址随机化,使得攻击者猜测确切的地址变得困难。使用如下指令关闭该功能。 $ su root Password: (enter root password) #sysctl -w kernel.randomize_va_space=0 (2)The StackGuard Protection Scheme:GCC编译器实现了一个被称为“Stack Guard”的安全机制来防御缓冲区溢出攻击。所以在编译漏洞程序时加上-fno-stack-protector参数来关闭该机制。 (3)Non-Executable Stack:Ubuntu曾经允许栈执行,但是现在程序必须声明栈是否允许执行。内核和链接器检查程序头的标志来判断是否允许栈被执行

C内存对齐

一世执手 提交于 2020-02-10 18:55:38
1.C语言中的结构体 1.1 定义 结构体 是由一系列相同或不同类型的变量组成的集合。 struct 结构体名{ //struct为关键字,“结构体名”为用户定义的 类型标识 。 数据类型1 成员名1; //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型。 数据类型2 成员名2; ... 数据类型n 成员名n; }; 1.2 结构体的内存分配(方法一) 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 例1. struct A{ struct B{ int a; char b; char b; int a; short c; short c; };