int与char
整型变量在内存中是以二进制方式存储的
原码、反码、补码(8倍数位)
1、正数的原码、反码、补码都相同
2、负数符号位为1
原码、反码(除符号位都取反)、补码=反码+1
结论:负数是以补码形式存储在内存中的
如果最高位为1(负数),则需转为原码;而正数三码相同,最高位为0
负数是以补码形式实现运算的
1)得到负数的二进制原码
2)转码得到反码
2)反码+1得到补码
4)最后负数是以补码的方式与正数相加的
char c=129;//(在内存中为1000 0001)
%d会得到-127(因为%d会认为1000 0001是补码)
常见ASCII码(0-127 扩展:128-255)
A:65
a:97
0:48
空格:32
字符串结束符('\0'):0
不是ASCII码:
EOF(-1):文件结束符
32位系统和64位系统
不同的地方在*p、size_t
*p 64位:8 32位:4
size_t 8 4
string 28 28
#include <stdbool.h> //bool 类型头文件
getchar、putchar、printf、sprintf、puts、gets
ch=getchar();//从键盘(设备)读取一个字符到ch,可以读取空格,返回int型
putchar(ch);//打印一个字符,返回int型
printf 在 linux 终端格式化输出颜色和定位
sprintf(str,"id:%s:%d","www","w");//结果:str="id:www:w"
//可以用该函数将数字转化成字符型数字
strcpy( dtm, "Saturday March 25 1989" );
sscanf( dtm, "%s %s %d %d", weekday, month, &day, &year );//直接分开
char* gets(char* str)//从键盘输入一串字符到str,可输入空格,直到换行。
int* puts(const char* str)//输出str到屏幕
char[]和char*的区别
char* str=“aaa\0”;//结果仍会继续补一个'\0',
即str的实际空间大小为5个字节,sizeof(str)为指针大小
char str[]={‘1’,‘2’,‘3’,‘4’,‘\0’};//sizeof(str)=5,若不用字符串常量赋值的话,需要手动添加’\0’
char[]不能改变指向,为指针常量
char*定义后仍能重新赋值,char\* str;str="11111";//合法
但是char*每次重新赋值地址都会改变,本质是指向了不同的字符常量,相当于常量指针,可以改变指向,但是不能改变指向元素的值,如:
char\* str="123456";
str[2]='2';//非法,无法改变元素的值
以下定义了一个char* str和一个char str1[]进行重赋值(str1无法重新赋值),还定义了另一个char* str2指向str,然后重新赋值
发现str1的指向和存储元素的值都没有改变。只是str和str2的指向,内存大小、元素值都变了。
#include<stdio.h>
#include<string.h>
int main()
{
char *str="123456";
char str1[]="123456";
char* str2=str1;
printf("str=%s\n",str);
printf("strlen(str)=%ld\n",strlen(str));
printf("str1=%s\n",str1);
printf("strlen(str1)=%ld\n",strlen(str1));
printf("地址:\n");
printf("str=%p\n",str);
printf("str1=%p\n",str1);
printf("str2=%p\n",str2);
//改变char* str的值及长度,发现可以改变,地址和内容改变
//说明重新赋值改变了指向的内存空间,指向了另一个字符串常量
str="123789111";
//对指向字符数组的指针重新赋值,发现指针不再指向数组,且数组内容也未改变
str2="1111111111";
//str1="123553";//非法,数组名为指针常量,无法改变指向,但是可以改变指向元素的值
printf("str=%s\n",str);
printf("strlen(str)=%ld\n",strlen(str));
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("strlen(str1)=%ld\n",strlen(str1));
printf("strlen(str2)=%ld\n",strlen(str2));
printf("地址:\n");
printf("str=%p\n",str);
printf("str1=%p\n",str1);
printf("str2=%p\n",str2);
return 0;
}
结果: