——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、C语言的进制:1、常用进制有2进制、8进制、10进制和16进制,进制3要素是数位,基数和位权。位权是一个固定值即 (数码值 *基数^数位)。
2、进制转换:10转2——除2取余(除到0),余数的倒序。
2转10——把所有位的位权相加之和。
2转16——4位合1法;整数部分从右向左结合,小数部分从左向右结合。
16转2——1拆4位,拆成2进制的4位。
2转8——3位合1法。
8转2——1拆4位法。
10转8——除8取余法。
10转16——除16取余法。
8转10——通过中间的2进制转换。
16转10——通过中间的2进制转换。
3、最高位存放符号:正为0,负为1。将带有符号位的机器数对应的真正数值称为其真值。
4、数据在计算机的内部是以补码的形式存储的。
1》正数的原码、反码、补码都相同。
2》负数的补码为原码除符号位不变,其余各位取反成为反码,然后反码+1成为补码。
3》有了补码之后,计算机就可以只做加法运算了。
5、位运算:位运算只能用于整型操作数。
即只能用于带符号或无符号的char short int 与 long 类型。
1) & 按位与 只用对应的两个二进制位均为1时,才为1。有0即为0。
2) | 按位或 有1即为1,只用对应的两个二进制位均为0时,才为0。
3) ~ 按位取反 即原值的二进制各数位1变0,0变1。
4) ^ 按位异或 对应的两个二进制位数相同为0,不同为1。
9^8=1 即( 0000 1001 ^ 0000 1000 = 0000 0001 )
5) << 按位左移 各二进制位数全部左移,左移时高位移出丢弃,低位补0。
左移有一个问题:可能会改变原数的正负性。
8<<2 =32 左移n位,相当于原数乘以2^n,即8*2^2=32。
6)>> 按位右移 各二进制位数全部右移,右移后低位移出去的部分丢弃,高位补
符号位。 8>>2 =2 右移n位,相当于原数除以2^n, 即8/(2^2)=2。
6、位运算是可以直接对计算机的二进制位的数据进行运算,所以其优势是运算速度快,运算效率高。位运算的应用也非常广泛。
二、数组:1、数组的概念:1)把具有相同数据类型的若干个变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。2)数组属于数据的构造类型。
3)数组的维数即数组下标的个数,分为一维数组,二维数组,多维数组。
4)按存储内容分类:数值数组、字符数组、指针数组、结构数组。
2、数组元素作函数参数:1)数组元素就是下标变量,它与普通变量并无区别。在发生函数调用的时候,把作为实参的数组元素的值伟递给形参,实现单向值传递。
2)定义:在C语言中使用数组必须先进行定义。
类型说明符 数组名 [常量表达式]
3)定义数组——给数组初始化——使用数组。
4)初始化:有两种方式:定义的同时初始化和先定义后初始化。
3、数组的存储:1)计算机会给数组分配一块连续的存储空间。
2)数组名代表数组的首地址,从首地址的位置,依次存入数组的每个元素。
3)每个元素占用相同的字节数(取决于数组类型)。
4)并且数组元素的地址是连续的。
5)先定义的数组分配高地址,后定义的分配低地址。
6)数组名代表了数组的首地址,也是数组第一个元素的地址。
7)&a[0]是第一个元素的地址;a[0]是第一个元素的值。
8)数组的长度 sizeof(数组名) 或 sizeof(&a[0])
4、数组名作实参:1)如果用数组名作为实参,则形参也必须是数组。
2)因为数组名是第一个元素的首地址,所以传送给形参的是地址, 这时两个数组共享同一段存储单元。
3)注意事项:a.形参与实参类型必须一致,否则会出错。
b.形参与实参长度可以不同,但运行结果可能与实际不同。
c.形参的长度可以不写。
5、二维数组:可以看做是一个特殊的一维数组,这个一维数组的每个元素又是一个一维数组
1)定义: 数据类型 数组名 [第一维长度(行)][第二维的长度(列)]
2)初始化: 可以完全初始化,也可以部分初始化。可以分段初始化,也可以连续初始化。可以省略第一维的长度,但不能省略第二维的长度。
3)使用:二维数组的每个元素都是一个双下标变量。
4)二维数组的遍历
for(i=0; i<3; i++)
for(j=0; j<4; j++){
printf("a[%d][%d]=%d\t",i, j, a[i][j]);
} printf("\n");
6、二维数组作函数参数:1)二维数组名作为函数参数相当于实参与形参地址的传递过程。
2)二维数组元素作为函数参数 相当于变量值的传递过程。
三、字符串:1、字符串的概念:是位于双引号中的字符序列。
1)在内存中以”\0”结束,所占字节比实际多1个。
2)字符串不能赋给字符变量。
3)C语言中没有字符串变量,可以用字符数组存放。
如: char ch[10]=”Hello”
2、字符数组:1)定义: char 数组名[常量表达式]
字符数组也可以是多维数组。 char 数组名 [ ] [ ]
2)初始化:分两种为定义同时和先定义后初始化。
3)字符数组的作用:保存字符和保存字符串。
3、%s用于字符串的输出:从给定的地址开始,输出字符直到遇”\0”结束。
char str[10]=”itcast”;
printf(“%s\n”,str); 或 printf(“%d\n”,&str[0]);
4、scanf输入字符串:1)如果以%s格式输入时,如有空格则空格后的字符将无法被保存。
因为scanf输入字符串时,遇空格即结束。
scanf(“%s”,str); 或 scanf(“%s”,&str[0]);
2)输入字符串的长度要小于字符数组的长度,否则会越界,可能会出错。
5、字符串的长度:等于数组在内存中占用的字节数。
1)专门计算字符串的长度的方法: strlen(str1) 计算结果不包括”\0”。
2)以 “\0”为结束标志,判断字符串的长度。
例:判断字符串中是否包含某个字符,如果包含,返回其首次出现的位置,否则返回-1。
#include <stdio.h>
int searchChar(char str[],char key){
for(int i=0; str[i]!=0; i++){
if(str[i]==key)
return i;
}
return -1;
}
int main()
{
char str[]="gjeijopsrnsjps";
int loc=searchChar(str,'s');
printf("%d\n",loc);
return 0;
}
输出结果为7。即a[7]是s在str数组中首次出现的位置。
6、使用puts和gets函数时,必须包含”stdio.h“
1)puts(字符数组名或数组首地址):必须是字符数组;可以自动换行;不支持格式化输出。
2)gets( ) 可以接收字符,也可以接收空格。
7、使用其它字符串函数则应包含”string.h“
strcat(str1, str2) 连接两个字符串。
strcpy(str1, str2) 复制B到A字符串中。
strcmp(str1, str2) 逐个比较A和B字符串每个元素的大小,来决定A和B字符串的大小。
strlen(str) 求字符串的长度,其结果不包含”\0“。
8、例:实现单词首字母大写,并统计单词的个数。
#include <stdio.h>
int main()
{
char str[100]; //申明一个字符数组
int word=0;//标识是否为单词 0表示为单词,1表示不是单词
int count=0;//统计单词个数
printf("请输入一句英文单词:\n");
gets(str); //接收字符串并保存到字符数组中
for(int i=0; str[i]!= '\0'; i++) {
if(str[i] == ' '){
word=0; //标记是一个单词
}else if (word == 0){
count++;
str[i]=str[i]-32; //将单词字母大写
word=1; //让单词标记变为不是一个单词
}
}
printf("所有单词首字符转换成大写后输出后的英文句子是:");
puts(str);
printf("单词个数为%d\n",count);
return 0;
}