深入理解指针(6)学习笔记
一、sizeof和strlen的对比sizeof1、本质是操作符。2、不关注内存中存放什么数据。3、计算操作数所占内存的大小单位是字节。strlen1、本质是库函数需要头文件string.h。2、关注是否有\0,如果没有就会向后找可能存在越界得到未知值。3、计算\0之前的字符个数。二、数组和指针笔试题1、整型数组题目****注意1、双引号内的字符串中自带\0,而整型数组里面没有不要搞混了。2、上面的题目主要考察对于数组名的理解只要不是直接sizeof或者直接都是首元素地址的意思。3、只要是地址的长度都是4或886位编译器是464位是8。2、字符数组题目上面sizeof的算法同1不再做解释。对于strlen来说传整个数组的地址和传数组首元素地址效果一样。如果将任意数字当地址传给strlen且数字在低地址区域程序会崩溃。3、字符串数组题目4、指针变量的题目注意后面三条printfp是指针变量自身的地址与数组中的元素没有直接关系。5二维数组的题目注意1、sizeof只是操作符不会进行访问所以也不会越界。2、二维数组的首元素是第一行的一维数组以上所有题目核心在于对一定条件下数组名的理解。三、指针运算笔试题1、题目12、题目23、题目3注意1、数组初始化的时候用的是逗号表达式所以实际上数组的六个元素是1、3、5、0、0、0.2、p[i]是pi的语法糖*最终的打印结果是1。代码解析int a[3][2] { (0, 1), (2, 3), (4, 5) };这里使用的是逗号表达式而非数组初始化列表。逗号表达式会依次计算每个括号内的表达式并取最后一个表达式的值。因此(0, 1)的结果是1(2, 3)的结果是3(4, 5)的结果是5数组a实际被初始化为{1, 3, 5, 0, 0, 0}后三个元素默认初始化为0。int *p a[0];将二维数组第一行即第一个一维数组的首元素地址赋给整型指针p。此时p指向a[0][0]其值为1。printf(“%d”, p[0]);等价于*(p 0)即访问p所指向的第一个元素也就是1。4、题目4代码解释当pa的时候将a即首元素地址赋给了p。p[4][2]的意思是p从第一个元素开始跳过四行再跳过下一行的两个元素。相减的结果是-4。但如果用地址打印要先转化成补码再转换成16进制。5、题目5注意数组相关指针的运算一定要画图思考指针的位置。6、题目67、题目7