C_变量 | 数据类型 | IO(2/10)



happysneaker.com

SQL注入的思想




以下博文所截笔记均来自:http://c.biancheng.net C语言中文网,并非用于营利,如有侵权,联系删除。





一、全角、半角


① 一个英文字符所占的位置称为“半角”,相对地把一个汉字所占的位置称为“全角”。

② 

半角输入:

C语言中文网!Hello C,I like!

全角输入:

C语言中文网!Hello C,I like!

③ 另外最重要的一点是:“相同”字符在全角和半角状态下对应的编码值(例如 Unicode 编码、GBK 编码等)不一样,所以它们是不同的字符。

④ 中文和英文模式下的制表符(键盘tab键)输入效果一致。








二、可执行程序

可执行程序是一系列计算机指令和数据的集合,它们都是二进制形式的,CPU 可以直接识别,毫无障碍。但是对于程序员,它们非常晦涩,难以记忆和使用。

例如,在屏幕上输出“VIP会员”,C语言的写法为:

puts("VIP会员");


happysneaker.com

二进制的写法







三、编译(compile)、链接(link)

编译(Compile)

① C语言代码由固定的词汇按照固定的格式组织起来,简单直观,程序员容易识别和理解,但是对于CPU,C语言代码就是天书,根本不认识,CPU只认识几百个二进制形式的指令。这就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,也就是将代码加工成 .exe 程序的格式;这个工具是一个特殊的软件,叫做编译器(Compiler)

② 编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(Compile)

③ 编译器可以 100% 保证代码从语法上讲是正确的。

链接(Link)

C语言代码经过编译以后,并没有生成最终的可执行文件(.exe 文件),而是生成了一种叫做目标文件(Object File)的中间文件(或者说临时文件)。目标文件也是二进制形式的,它和可执行文件的格式是一样的。对于 Visual C++,目标文件的后缀是.obj;对于 GCC,目标文件的后缀是.o
② 目标文件经过链接(Link)以后才能变成可执行文件。既然目标文件和可执行文件的格式是一样的,为什么还要再链接一次呢,直接作为可执行文件不行吗?
③ 不行的!因为编译只是将源代码变成了二进制形式,它还需要和系统组件(比如标准库、动态链接库等)结合起来,这些组件都是程序运行所必须的。
④ 链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)
随着编写的代码越来越多,最终需要将它们分散到多个源文件中,编译器每次只能编译一个源文件,生成一个目标文件。这个时候,链接器除了将目标文件和系统组件组合起来,还需要将编译器生成的多个目标文件组合起来。

⑤ 再次强调,编译是针对一个源文件的,有多少个源文件就需要编译多少次,就会生成多少个目标文件。

总结

不管代码有多么简单,都必须经过「编译 --> 链接」的过程才能生成可执行文件:

  • 编译就是将我们编写的源代码“翻译”成计算机可以识别的二进制格式,它们以目标文件的形式存在;

  • 链接就是一个“打包”的过程,它将所有的目标文件以及系统组件组合成一个可执行文件。


如果不是特别强调,一般情况下所说的“编译器”实际上也包括了链接器,比如,你使用了哪种编译器?

为当前程序配备的专用文件夹,在 IDE (集成开发环境)中也有一个专门的称呼,叫做“Project”,翻译过来就是“工程”或者“项目”。在 Visual C++ 6.0 下,这叫做一个“工程”,而在 Visual Studio 下,这又叫做一个“项目”,它们只是单词“Project”的不同翻译而已,实际上是一个概念。

不同的程序对应不同的工程类型(项目类型),使用 IDE 时必须选择正确的工程类型才能创建出我们想要的程序。换句话说,IDE 包含了多种工程类型,不同的工程类型会创建出不同的程序。




四、安装程序 和 免安装程序


① 其实并无多大区别,安装程序只是多了一点自由配置的步骤:http://c.biancheng.net/view/vip_1744.html

② 如何制作Windows程序安装包?http://c.biancheng.net/view/vip_1745.html






五、函数简介

1、puts("hello world");  // 打印 hello world   

2、pow(10,2);  // 打印102

(puts 是 output string 的缩写,只能用来输出字符串,不能输出整数、小数、字符等,我们需要用另外一个函数,那就是 printfprintf 是 print format 的缩写,意思是“格式化打印”。这里所谓的“打印”就是在屏幕上显示内容,与“输出”的含义相同,所以我们一般称 printf 是用来格式化输出的)


实际上,头文件往往只包含函数的说明,也就是告诉我们函数怎么用,而函数本身保存在其他文件中,在链接时才会找到。对于初学者,可以暂时理解为头文件中包含了若干函数。

引入头文件使用#include命令,并将文件名放在< >中,#include 和 < > 之间可以有空格,也可以没有。

头文件以.h为后缀,而C语言代码文件以.c为后缀,它们都是文本文件,没有本质上的区别,#include 命令的作用也仅仅是将头文件中的文本复制到当前文件,然后和当前文件一起编译。你可以尝试将头文件中的内容复制到当前文件,那样也可以不引入头文件。

.h中代码的语法规则和.c中是一样的,你也可以#include <xxx.c>,这是完全正确的。不过实际开发中没有人会这样做,这样看起来非常不专业,也不规范。头文件不是必须要引入的,用到才引入。

较早的C语言标准库包含了15个头文件,stdio.h 和 stdlib.h 是最常用的两个:

  • stdio 是 standard input output 的缩写,stdio.h 被称为“标准输入输出文件”,包含的函数大都和输入输出有关,puts() 就是其中之一。

  • stdlib 是 standard library 的缩写,stdlib.h 被称为“标准库文件”,包含的函数比较杂乱,多是一些通用工具型函数,system() 就是其中之一。






六、彩色的C语言http://c.biancheng.net/view/vip_1749.html(卵用)






七、数据类型


1、

我们知道,诸如数字、文字、符号、图形、音频、视频等数据都是以二进制形式存储在内存中的,它们并没有本质上的区别,那么,00010000 该理解为数字16呢,还是图像中某个像素的颜色呢,还是要发出某个声音呢?如果没有特别指明,我们并不知道。

也就是说,内存中的数据有多种解释方式,使用之前必须要确定;上面的int a;就表明,这份数据是整数,不能理解为像素、声音等。int 有一个专业的称呼,叫做数据类型(Data Type)

顾名思义,数据类型用来说明数据的类型,确定了数据的解释方式,让计算机和程序员不会产生歧义。在C语言中,有多种数据类型,例如:

说  明字符型短整型整型长整型单精度浮点型双精度浮点型无类型
数据类型charshortintlongfloatdoublevoid

这些是最基本的数据类型,是C语言自带的,如果我们需要,还可以通过它们组成更加复杂的数据类型。


2、

在C语言中,每一种数据类型所占用的字节数都是固定的,知道了数据类型,也就知道了数据的长度。

在32位环境中,各种数据类型的长度一般如下:

说  明字符型短整型整型长整型单精度浮点型双精度浮点型
数据类型charshortintlongfloatdouble
长度Byte124448


3、

除了C语言,Java、C++C#等在定义变量时也必须指明数据类型,这样的编程语言称为强类型语言。而PHP、JavaScript等在定义变量时不必指明数据类型,编译系统会自动推演,这样的编程语言称为弱类型语言



4、整数

http://c.biancheng.net/view/1758.html


5、各进制表示

http://c.biancheng.net/view/1759.html


6、注意 i++  和 ++i 


7、类型自动转换:编译器自动进行数据类型的转换

happysneaker.com


8、强制类型转换:程序员自己需要指明

强制类型转换的经典例子:纯文本复制

#include <stdio.h>
int main(){
int sum = 103;  //总数
int count = 7;  //数目
double average;  //平均数
average = (double) sum / count;
printf("Average is %lf!\n", average);

return 0;
}

运行结果:
Average is 14.714286!


无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。







八、变量


1、

为了让程序的书写更加简洁,C语言支持多个变量的连续定义,例如:纯文本复制

int a, b, c;
float m = 10.9, n = 20.56;
char p, q = '@';

连续定义的多个变量以逗号,分隔,并且要拥有相同的数据类型;变量可以初始化,也可以不初始化:

int a=100;
int b=200;
int c=300;
printf("a=%d, b=%d, c=%d", a, b, c);

会在屏幕上显示:
a=100, b=200, c=300


2、

%d称为格式控制符,它指明了以何种形式输出数据。格式控制符均以%开头,后跟其他字符。%d 表示以十进制形式输出一个整数。除了 %d,printf 支持更多的格式控制,例如:

  • %c:输出一个字符。c 是 character 的简写。

  • %s:输出一个字符串。s 是 string 的简写。

  • %f:输出一个小数。f 是 float 的简写。







九、输入输出——输入输出的“命门”就在于缓存,后面做笔记。


1、输出——在C语言中,有三个函数可以在显示器上输出数据:

① puts() : 只能输出字符串,自动换行

② putchar() : 只能输出单个字符

③ printf() : 可以输出各种类型的数据

printf() 是最灵活、最复杂、最常用的输出函数,完全可以替代 puts() 和 putchar()


sleep(4);   //休眠4秒  ,Windows中为   Sleep(4000)

#include <stdio.h>
int main()
{
    puts("dd"); 
    sleep(10);
    putchar('k');
	
    return 0;
}


2、输入——同样也是三类:

① scanf() : 和printf类似,支持多种类型

② getchar() 、getche()、getch() : 仅单个字符

③ gets() : 获取一行数据,作为字符串处理


对三个函数的总结

函数缓冲区头文件回显适用平台
getchar()stdio.hWindows、Linux、Mac OS 等所有平台
getche()conio.hWindows
getch()conio.hWindows


#include <stdio.h>
int main()
{
int a = 0, b = 0, c = 0, d = 0;
scanf("%d", &a);  //输入整数并赋值给变量a
scanf("%d", &b);  //输入整数并赋值给变量b
printf("a+b=%d\n", a+b);  //计算a+b的值并输出
scanf("%d %d", &c, &d);  //输入两个整数并分别赋值给c、d
printf("c*d=%d\n", c*d);  //计算c*d的值并输出

return 0;
}

happysneaker.com


其实 scanf 和 printf 非常相似,只是功能相反罢了:

scanf("%d %d", &a, &b);  // 获取用户输入的两个整数,分别赋值给变量 a 和 b
printf("%d %d", a, b);  // 将变量 a 和 b 的值在显示器上输出

它们都有格式控制字符串,都有变量列表。不同的是,scanf 的变量前要带一个&符号。&称为取地址符,也就是获取变量在内存中的地址。


① C语言中常用的从控制台读取数据的函数有五个,它们分别是 scanf()、getchar()、getche()、getch() 和 gets()。其中 scanf()、getchar()、gets() 是标准函数,适用于所有平台;getche() 和 getch() 不是标准函数,只能用于 Windows。

② scanf() 是通用的输入函数,它可以读取多种类型的数据。

③ getchar()、getche() 和 getch() 是专用的字符输入函数,它们在缓冲区和回显方面与 scanf() 有着不同的特性,是 scanf() 不能替代的。

④ gets() 是专用的字符串输入函数,与 scanf() 相比,gets() 的主要优势是可以读取含有空格的字符串。

⑤ scanf() 可以一次性读取多份类型相同或者不同的数据,getchar()、getche()、getch() 和 gets() 每次只能读取一份特定类型的数据,不能一次性读取多份数据。



3、数据在内存中的存放——更具体的后面再补充

int a;会在内存中分配四个字节的空间,我们将第一个字节的地址称为变量 a 的地址,也就是&a的值。对于前面讲到的整数、浮点数、字符,都要使用 & 获取它们的地址,scanf 会根据地址把读取到的数据写入内存。


将变量的地址输出看一下:

#include <stdio.h>
int main(){int a='F';int b=12;int c=452;printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);return 0;}

输出结果:
&a=0x18ff48, &b=0x18ff44, &c=0x18ff40

%p是一个新的格式控制符,它表示以十六进制的形式(带小写的前缀)输出数据的地址。如果写作%P,那么十六进制的前缀也将变成大写形式。

happysneaker.com
图:a、b、c 的内存地址


注意:这里看到的地址都是假的,是虚拟地址,并不等于数据在物理内存中的地址。虚拟地址是现代计算机因内存管理的需要才提出的概念。





Web安全技术分享
请先登录后发表评论
  • 最新评论
  • 总共0条评论