《每天一分钟学习C语言·八》字符串,指针与二维数组,补码,按位取反

1、
枚举

enum WeekDay  //这是一个数据类型
{
    
    
	//MonDay, TusDay,....
};
enum WeekDay day = MonDay;
printf(%d\n”, day); //输出0,枚举里面元素都是从0开始排列

2、
字符串
(1)在字符串中加双引号前面需要有反斜杠
(2)%p是打印地址,%u输出无符号十进制,-123输出补码4294967173
%8.3f //右对齐,宽度为8,保留三位小数,宽度不足8用0或空格补齐,有负号表示左对齐
(3)const char m[10] = “helloworld”; //const在最前面表示值不能被更改
const char * pst = “helloworld”; //值不能被更改,但pst地址可以更改
char * const pst = “helloworld”; //地址不能更改,但值可以更改
char const * pst = “helloworld”; //值不能改,地址可变
综上:const在 * 左边值不能改,const在*右边地址不能改
(4)字符串末尾默认有空字符’\0’,如char * name = “huang”; //总字节数为6
(5)char [10] = {‘a’, ‘b’, ‘c’, ‘\0’}; //带空字符表字符串,无空字符表字符数组
(6)char * name = “helloworld”; //等价于char name[] = “helloworld”; 需要注意的是数组定义的字符串可以修改,指针定义的字符串无法修改
(7)arr为数组名也是第一个元素地址,arr+1表示第二个元素地址,但arr是指针常量,不可修改的左值,否则会改变数组存储位置即地址,也不允许++arr这样自增操作,这种只能用于可修改的左值。如果是指针定义的字符串,地址是可以修改自增的,如char * name = “huang”; //name++表示指向下一个元素地址
(8)定义字符数组在内存中开辟一块地址空间,把字符串存进去,指针定义字符串是把字符串地址赋给指针,所以前者数组地址和字符串地址不同,后者地址相同。
(9)地址与整数相加 = 整数X地址指向类型字节大小+地址
地址与整数相减 = 地址-整数X地址指向类型字节大小(需要转16进制)
两指针地址相减必须保证两指针指向同一个数组,如0Xff8d8-0Xff8d0=2表示两个Int类型的距离
(10)puts(name) //输出字符串遇到’\0’结束,自动换行
gets(name) //输入字符串,吸收\n转化成\0字符
fgets(name, 5, stdin); //返回第一个字符地址,输入hu,保存在Name中的为hu\n\0\0 输入huan,保存huan\0 输入huanghua,保存huan\0
fputs(name, stdout); //输出字符串遇到\0结束,不自动换行
(11)strlen(name); //计算字符串长度,不包含\0
strcat(str1, str2); //把字符串str2拼接到str1后面形成新的字符串str1,末尾自动加\0 (注意:str2字符串在见到str1字符串的空字符开始拼接,拼接成新的字符串内容拷贝到str1指向的内存空间,拷贝的是内容不是地址)
strncat(str1, str2,5); //str2中前五个字符拼接到str1后面形成新的str1,末尾自动加\0
strcmp(str1, str2); //两字符串从左到右ascii码值比较,相等返回0,str1>str2返回正整数,str2>str1返回负整数
strncmp(str1, str2, 5); //比较两字符串前五个字符
strcpy(str1, str2); //把str2字符串拷贝到str1中,形成新的str1,拷贝的是字符串内容不是地址
strncpy(str1, str2, 5); //把str2中前5个字符拷贝到str1中
(12)getchar()接收一个字符并返回,无字符返回-1或EOF
putchar(‘S’); 输出一个字符
(13)atoi(str) //把字符串变成整型输出,如int i = atoi(“22”); //i就是22整型
itoa(i) //把整型变成字符串输出,如char * p = itoa(22); //输出字符串22
atof() //数字字符串转double类型,如double b = atof(“23.4”); //输出23.4
ftoa() //浮点型转字符串,char * p = ftoa(23.4); //输出字符串23.4
atol() //字符串转long类型,long a = atol(“23”); //输出long类型23
注意:最大只能转换2147483648,想要转换更大的需要atoll
ltoa()// long类型转字符串,char *p = ltoa(23); //输出字符串23
(14)sprintf(str, “%d, %s”, 2, “huanghua”); //字符串str存放的是2,huanghua
(15)%.5s //最多输出五个字符,%5s //至少输出五个字符,不够空格补
(16)fscanf(fp, “%d %d %s”, &i, &j, str); //从fp文件指针中读取数据到i,j,str中,第三块是输入列表
fprintf(fp, “%d %d %s”, i, j, str); //把i,j,str内容写入到fp指针文件中去,,第三块是输出列表
(17)char * strchr(const char *s, int c) //如果s字符串包含字符c,函数返回指向s字符串首次出现c字符的指针(末尾空字符也是字符串的一部分,所以在查找范围内),若未找到c字符,返回NULL
(18)char *strpbrk(const char *s1, const char *s2) //若s1字符串包含s2字符串的任意字符,函数返回指向s1字符串首位置的指针,否则返回NULL
(19)char * strrchr(const char *s, int c) //函数返回s字符串中最后一次出现c字符的位置指针(末尾空字符也在查找范围),若找不到c字符返回NULL
(20)char * strstr(const char *s1, const char *s2) //函数返回指向s1字符串中s2字符串出现的首位置,若找不到s2返回NULL

3、
指针与二维数组
int a[4][2]; //a数组有4个大元素,每个大元素有2个小元素。
(1)a是第一个大元素的地址,即a == &a[0]
(2)a[0]是第一个大元素,可以看成b,则b[0],b[1]分别是这个大元素数组里的第一、二个元素,则a[0]是大元素里第一个元素的地址,即a[0] == &a[0][0]
(3)*a == a[0] , ** a == a[0][0]
(4)int ( * p)[2] == int [][2] //这个类似于指针定义的字符串,char * p = “huang”; 等价于char p[] = “huang”
(5)Int * p[2]; //定义一个int *类型的数组,有两个元素,每个元素都是int *类型
(6)a[m][n] == * ( *(a+m)+n)
(7)typedef int arr[4]; //使arr成为一个新的数据类型,该数据类型包含四个Int型数据。则定义变量arr a;等价于int a[4] ; typedef arr pst[3]; //使pst成为一个新的数据类型,该数据类型包含三个arr型数据。则定义变量pst p;等价于int pst[3][4];
关于指针记住几句话:
char *p; char *q;
(1)赋地址p = q;
1、改变一个地址存放的值,另一个地址存放的值也会改变,因为都是指向同一个地址
2、p、q都是两个独立的个体,地址赋完后互不干扰,改变p值不会影响q,改变q值不会影响p。如p = q = 1001H,若q = 1002H,那么p还是1001H。
(2)赋地址的地址 &p = &q;
1、改变地址的地址存放的地址,另一个地址也会变,因为都是指向同一个地址的地址。
2、&p、&q是两个独立的个体,地址的地址赋完后互不干扰,改变&q值不会影响&p,改变&p值不会影响&q。如&p = &q = 1001H,若&q = 1002H,那么&p还是1001H。

4、

int a[10];
int * p = a;
* ++p == p[1]
++ *p == p[0]+1
*p++ //先取*p值,然后p指向下一个元素地址
*p+=2 //*p = *p+2

5、
补码
正数补码是自己
负数补码如-3补码:
3转二进制 0011
取反+1 1101
因是Int型前面还有28个1
-3补码十六进制为:fffffffd

补码求原码:fffffffd
取反+1 0011 为3
加个负号为-3

是正是负看最高位是0还是1
char(1字节八位看第八位是0还是1)-128(80)——+127(7F)
short(2个字节)-32768(8000)——+32767(7FFF)
int(4字节)-2147483648(80000000)——+2147483647(7FFFFFFF)

按位取反~
~9值
9是1001,前面省略28个0
~9是0110,前面省略28个1,此时最高位为1可知原码为负数
取反+1为1010,是10
加个负号为-10

按位左移<<
8<<3值
8是1000,左移三位右边补0为0100 0000,即64

6、
一个符号求值,两个符号判断真假
4&6 == 4
4&&6 ==1为真
!4 == 0为假

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cs1395293598/article/details/135172843
今日推荐