这周回到学校搞毕业要求的实习了,但是刚入职就遇上了公司的业务活动,几条业务线相关的需求全发过来,累死个人,C的学习也稍微少了一点,只能把剩下一点东西凑吧凑吧写一个文章出来了。
Q1:静态库的创建与使用
通过将代码配置为静态库,再通过提供.h文件中的函数声明,即可在不泄露源代码的前提下向他人提供解决问题的静态库。
静态库的生成方法:右键项目-----》点击属性-----》进入菜单:配置属性\常规-----》选项:配置类型-----》静态库
完成静态库的生成之后就可以在debug文件夹下找到.lib静态库文件。
将.lib静态库文件与.h头文件一同发给使用者,使用者将.h加入工程,并在代码中写#pragma comment(lib,"函数.lib")导入静态库来使用库中的函数(lib表示静态库,"函数.lib"为静态库文件名)。
复杂情况下,一个静态库可能依赖于另一个静态库。
Q2:二维数组的初始化
二维数组的初始化与一维数组的初始化有些类似有有些不同
在赋值初始化时,一维数组可以省略个数,直接通过输入值来初始化,二维数组可以且仅可以省略行(三维数组也是)
int arr[][];
//此写法会报错,因为二维数组可以省略行数,但不可以省略列数
int arr[][2] = { {1,2} ,{3,4} };
//此写法成立,因为二维数组可以省略行,由编译器判断
//此处只输入了两行,被编译器判断为只有两行
当二维数组仅声明,不做初始化时,必须既写明行、又写明列
int arr[][4];
//此写法报错
int arr[1][2];
//此写法不报错
int arr[][4] = { 1,2,3,4 }
//此写法不报错
二维数组在行、列上都支持不完全初始化
int arr3[3][3] = { {1,2},{2,3} };
//用两组数字初始化,默认一组对应一行,第三行没有给值,是不完全初始化,默认为0
//此二维数组实际为
//1,2,0
//2,3,0
//0,0,0
Q3:数组名
数组名在大部分情况下,都可以等同于数组首地址,但在以下两种情况下例外
sizeof(arr):在之前的学习中,我们常用sizeof(arr)/sizeof(arr[0])求得数组长度,我们可以发现,若arr完全等同于地址,sizeof(arr)应当等于4或8(地址的大小),但实际上sizeof(arr)求得的是整个数组的大小,也就是说sizeof(arr)中的arr表示的不是首元素地址,而是整个数组
int arr[]={ 1, 2, 3};
printf("%d",sizeof(arr));//12
&arr:虽然当我们以地址的形式打印&arr与arr可以得到相同的地址,但实际上这二者的含义并不相同,前者表示的实际上是数组的地址。
printf("%p",arr);
printf("%p",&arr);
//结果一致
通过指针运算可以验证:
int arr[3]={ 1, 2, 3 };
printf("%p",arr);
printf("%p",arr+1);
//对比可以看出移动了4字节
printf("%p",&arr);
printf("%p",%arr+1);
//对比可以看出,移动了12字节
由于指针运算的基本单位是类型的大小,因此前后对比我们可以看见两次指针运算的步长不同,说明类型的大小不同,而上方正是int的大小,下方正式int[3](数组的类型)的大小,可以说明&arr实际是整个数组的地址
Q4:F9、F10、F11的不同调试功能
F9可以给一行代码进行标记,使F5执行停留在F9语句
F10逐过程调试:不关注函数内部如何执行,只在当前函数调试
F11逐语句调试:进入函数内部一条一条语句进行调试
Q5:字符串长度与字符数组长度
我们都知道字符串长度实际上是指的字符数组知道'\0'之前的所有数组的个数,而字符数组的长度,指的是字符数组中存放元素的个数,二者有相关性,但在某些情况下会混淆
char arr[]="abc";
//此数组实际为{ 'a', 'b', 'c', '\0' };
//此数组字符串长为3,数组长为4
char arr1[]={ 'a', 'b', 'c' };
//此数组字符串长为不定值,数组长为3
//也就是说arr数组长大于arr1,但字符串长不一定
840

被折叠的 条评论
为什么被折叠?



