------------------------------------------------------------------------------------
printf和scanf的区分
&是一个取地址符,&a表示变量a的地址。
scanf("%d",&a); 表示从键盘接收一个整数存储到内存中&a所指的地址,也就是变量a中。
&a表示变量在内存中的地址,是a在内存空间中的地址;
&a所指的地址:即存储字节的地址,即变量a的值存放的地方,即变量a中。
scanf("%d",&a);是指把输入的内容存放到 a所在的内存空间的地址所指向的字节存储地址中,即把输入的内容赋值给了a;
scanf("%d",a);是把输入的内容存放到 a所在的内存空间的地址中,这个地址是编译系统分配的,这么所就改变了内存空间地址,危险;
printf("%d",a);是指把a中的内容赋值给%d打印;
printf("%d",&a);是指把a的地址赋值给%d打印;
两个之所以不同是因为printf中是取值,就直接把当前值给出去就好了,
而scanf中是从外界接受值,"%d"后面的值是指输入数据要存入的地方,是这个值的下一级,或者可以说是这个值所指向的地方。
-----------------------------------------------------------------------------------
1.标准输入输出函数
putchar.
<1>putchar作用是向终端输出一个字符,即使在putchar(a,b)也只能输出第一个字符
putchar只能输出字符型的变量,其他变量输出会报错,但是这个字符型变量可以等于整形的
比如char c=65;putchar(c);或者putchar(97);都是对的;
而int c=65;putchar(c);是错的,但是强制类型转换putchar((int)c);是对的
putchar(‘101‘)能输出1,因为1也是一个ASCII字符。
putchar(‘\101‘)能输出A,因为它输出了转义字符。
putchar(‘\\‘)能输出\字符。putchar(92);也能输出\字符。
-----------------------------------------
综上可见,所有能输出的字符都是ASCII表中存在的,只不过由于编译系统的符号问题,有些符号比如说‘\不能直接输出,因为这样编译系统会报错,所以我们采用了转义字符输出,即:putchar(‘\?‘);这里面的问号可以是数字0-255,也可以是‘\符号
转义字符的意思是把当前字符换成ASCII码表中的另一种表示方式然后输出!!
比如:putchar(‘\101‘)=putchar(101)=putchar(‘A‘) 而putchar(‘\\‘)=putchar(92)
转义字符的真正含义是把转义字符后面的字符转换成ASCII码的数值进行输出。
变量就是存储在内存某一块地址中的数值,其值是可以改变的
变量名就是你在程序中如何使用这块地址,给他起了一个名字
变量名实际上是以一个名字代表一个内存地址,编译系统在工作时,会给每个变量名分配内存地址和空间,如char分配1个字节,在这一个字节中使用0/1编码可以表示0-255种字符。对变量的值进行改变,实际上先通过变量名查找到该变量所在的内存地址,再对这个地址的存储单元中取出当前的0/1编码进行操作。
-----------------------------------------
将一个字符常量赋值给字符变量,实际上不是把字符本身放到内存单元中,而是把字符对应的ASCII码放到内存单元中,以字符输出,先转换再输出;以整数输出,直接输出!
-----------------------------------------
我们在输出变量名的时候,putchar(a)实际上做的就是通过变量名a查找到内存地址,取出该地址存储单元中的数值(ASCII码值);
而putchar(‘a‘)的时候进行的是直接输出数值。
走下putchar(‘a‘)的流程:编译系统编译通过,编译成二进制的中间文件,然后系统分配给a一个无名的1字节内存空间,这个空间里存放的值是65。然后操作系统进行库文件连接,知道了输出的格式为char类型后,就先把数值转换成字符,然后打印到输出设备上,这个临时空间就清空了。
-----------------------------------------------------------------------------------
综上:
char a=65/char a=‘a‘ 内存中存放的都是65
putchar(a)是查找a所在地址存储空间数值,进行char类型的格式化输出,输出的都是a
putchar(96)实际上是没有进行空间存储,它是直接把96转换成二进制码输出对应的字符‘
putchar(‘abcdadf‘)是临时开辟无名内存,内存中只有65一个数,输出是a
putchar(‘101‘)同上,因为1也是字符,只不过内存中数字变了
putchar(‘\101‘)转义字符,本来内存只能存入1对应的码的,但是\101开辟内存时把101变成了存储的值,现在内存中存放了101,输出变成了101对应字符
putchar(‘\\‘)在上面基础上开辟内存的时候把\对应的ASCII码值变成了存储的值,这样输出的时候就直接输出字符\,如果不这么做,执行系统是无法直接输出\字符的,编译系统会报错的
putchar(‘\1011‘)在转义字符开辟内存时1011超过了255,所以无法存入存储空间,这个转义符就没起到作用,本质是=putchar(‘1011‘)
-----------------------------------------------------------------------------------