前后花了六天的时间,把C语言"入了个门",之所以是双引号的入门,因为一些认为比较重要、不是特别好理解的知识点,虽然当时理解了,但是印象不深,所以决定还是放慢节奏,今天把前面的总结一下,知识二次加工,提取出重要的内容,后面再去找开源项目通过项目进一步学习和巩固基础知识。
- sizeof是运算符,用于计算数据类型所占的存储空间
- 数组遍历的写法
// 动态计算数组的元素个数
int length = sizeof(scores) / sizeof(scores[0]);
for (int i = 0; i < length; i++) {
printf("scores[%i] = %i\n", i,scores[i]);
}
数组的存储和变量有点不一样, 数组存储元素, 是从所占用的低字节开始存储
- 数组的地址就是数组首个元素的地址,也是数组名的地址。
- 二进制、八进制、十六进制如何表示和输出
int num2 = 0b1100;//二进制
int num1 = 014;//八进制
int num3 = 0xc;//十六进制
printf("%d\n", num1);//十进制输出
printf("%o\n", num);//八进制输出
printf("%x\n", num);//十六进制输出
十进制转二进制:除2取余 倒序读取
- 二进制转八进制、转十六进制、位运算的特点和规律、位运算的练习(C语言入门(七)之进制、位运算、左移右移)
这部分基础内容其实很重要,虽然属于基础,但是在编码的时候,掌握一些位运算的技巧可以优化程序的性能(相对的),缺点就是不易理解。所以需要掌握位运算的特点和规律、位运算的练习也是必要的,但并不紧急。
但是也不必立刻就掌握和记住,用到的时候,或者看其他开源软件源码不理解的时候记得回来翻看,练练就好,没必要死记。
- 内存中存储的是补码。正数的三码一样,负数的补码等于原码取反加一
- 将一个整数以二进制方式输出
/* 技巧:
1.任何数与1相&都是那个数
2.利用位移取出每一位
*/
void printBinay(int value)
{
// 1.定义变量需要向右移动的位数
int offset = 31;
// 2.通过循环取出每一位
while (offset >=0) {
int result = (value >> offset) & 1;
printf("%i", result);
// 3.每次取出一位就让控制右移的变量-1
offset--;
if ((offset+1) % 4 == 0) {
printf(" ");
}
}
printf("\n");
}
- 数组名作为函数的参数传递, 传递的是数组的地址
指针在64位编译环境占8个字节
-
如果数组作为形参, 那么在函数中就不能通过数组的名称计算出数组元素的个数
。因为系统会自动将数组形参转换为指针, 指针占用8个字节。如果数组作为参数传递给函数内容时,如果内部想要获取数组长度,只能在函数外部,将数组长度计算出来,然后作为参数传递到函数内部
-
桶排序和二分查找
桶排序会有一个数组,以输入数据为下标,元素内容为每个输入数据的次数。数组初始化大小是输入参数中最大数的大小-1,所以不适合用来排序参数较大的输入,会占用很多空间。如果数据不大,使用倒是很方便的。
二分查找主要体现一种分治的思想。查找前要求数组排好序。也就是,先排序,再查找。
-
进制查表算法(C语言入门(十四)之位运算、循环、数组练习)
-
字符串必须以\0结尾
-
字符串的本质就是数组,字符串的API(C语言入门(十六)之字符串)
-
指针变量只能存储地址,64位系统占8个字节
&取地址符
%p输出地址
*可用于取指针变量的内容
- 通过指针取数组元素
int ages[3] = {1, 3 , 5};
int *p;
p = ages;
for (int i = 0; i < 3; i++) {
// 指针+1, 是加上指针类型所占用的长度
printf("ages[%i] = %i\n", i, *(p + i));
}
只要一个指针指向了数组, 那么访问数组就有3种方式:
1. : ages[0];//通过数组变量和索引访问
2. : p[0];//通过指针变量和索引访问
3. : *(p + 0);//通过指针变量计算访问数组元素
- 通过数组保存字符串和通过指针保存字符串的区别
一个保存在栈中,一个在常量区;一个可以修改,一个不能修改
- 求字符串算法
char *name = "lnj";
// size_t size = strlen(name);
int size =myStrlen3(name);
printf("size = %i\n", size);
int myStrlen3(char *str)
{
int count = 0;
// \0 ascii 0 // 0代表假 1真
while (*str++)count++;
return count;
}
- 指向函数的指针的应用(C语言入门(十八)之指针、字符串、函数)
最大的启发是做回调函数
- 结构体是用于保存一组不同类型的数据
- 结构体的定义和初始化
struct Person
{
int age;
char *name;
double height;
} sp;
- 结构体分配存储空间,获取结构体类型中占用内存最大的属性的大小, 然后取该大小的倍数。
- 执行结构体的指针
(*sip).name = "xxx";
- 结构体数组
- 结构体嵌套
- C语言中的枚举
- static关键字,修饰变量和方法的时候,会把作用域限定在文件内
- 带参数的宏,条件编译
#ifdef SCORE // 判断是否定义了后面的宏
printf("score\n");
#elif COUNT
printf("count\n");
#else
printf("OTHER\n");
#endif
- 预处理指令在编译前执行
- 宏定义的作用: 会在程序翻译成0和1之前, 将所有宏名替换为 宏的值
- typedef可以给任何数据类型重命名
- const修饰的变量内容不可改变,变量变为常量。
- const修饰的指针变量,指针变量指向的地址的内容可以改变,但是指针保存的地址不能变。