网站整站模板江西网站建设
网站整站模板,江西网站建设,连云港做网站公司,珠海网站建设策划【C语言】——指针七#xff1a; 前言一、 s i z e o f sizeof sizeof 与 s t r l e n strlen strlen 的对比1.1、 s i z e o f sizeof sizeof1.2、 s t r l e n strlen strlen1.3、 s i z e o f sizeof sizeof 和 s t r l e n strlen strlen 对比 二、数组和指针笔试题解析… 【C语言】——指针七 前言一、 s i z e o f sizeof sizeof 与 s t r l e n strlen strlen 的对比1.1、 s i z e o f sizeof sizeof1.2、 s t r l e n strlen strlen1.3、 s i z e o f sizeof sizeof 和 s t r l e n strlen strlen 对比 二、数组和指针笔试题解析2.1、题组一2.2、题组二2.3、题组三2.4、题组四2.5、题组五2.6、题组六2.7、题组七2.8、题组八 前言 在前面的学习中我们已经对C语言指针的知识有一个较为全面的了解那么接下来我们做一些练习吧即是检验我们的学习成果也是对之前的知识的巩固。
一、 s i z e o f sizeof sizeof 与 s t r l e n strlen strlen 的对比
1.1、 s i z e o f sizeof sizeof 因为后面的习题大量涉及 s i z e o f sizeof sizeof 与 s t r l e n strlen strlen 这里我们将简单回顾一下。 s i z e o f sizeof sizeof 用于计算类型的大小单位是字节。括号中可以放置类型也可以放置表达式。他是一个操作符而非函数当后面放入的是表达式时括号可以省略不写这也侧面验证了 s i z e o f sizeof sizeof 不是函数你见过函数行参考可以不带括号的吗 s i z e o f sizeof sizeof 只关心他里面的类型表达式所占用空间的大小并不进行具体的计算。 举例
#includestdio.h
int main()
{int a 10;printf(%d\n, sizeof(a));printf(%d\n, sizeof a);printf(%d\n, sizeof(int));return 0;
}1.2、 s t r l e n strlen strlen s t r l e n strlen strlen 是C语言中的库函数它用来计算字符串的长度。 他的原理是从传递的指针变量开始从前往后计算字符的个数知道遇到 ‘\0’ 停止 ‘\0’ 本身不计算 需要注意的是 s t r l e n strlen strlen 是直到 ‘\0’ 才停止一直没有 ‘\0’ 则一直计算因此 s t r l e n strlen strlen 有可能会越界访问。 下面是 s t r l e n strlen strlen 的 模拟实现
#includestdio.h
#includeassert.hint my_strlen(const char* str)
{assert(str);const char* p str;while (*(str)){;}return str - p - 1;
}s t r l e n strlen strlen 的应用举例
#includestdio.h
int main()
{char arr1[] { a,b,c };char arr2[] abc;printf(%d\n, strlen(arr1));printf(%d\n, strlen(arr2));printf(%d\n, sizeof(arr1));printf(%d\n, sizeof(arr2));return 0;
} 1.3、 s i z e o f sizeof sizeof 和 s t r l e n strlen strlen 对比 s i z e o f sizeof sizeof s i z e o f sizeof sizeof 是操作符 s i z e o f sizeof sizeof 计算操作数所占内存空间的大小单位是字节 s i z e o f sizeof sizeof 不关心内存中存放什么数据 s t r l e n strlen strlen s t r l e n strlen strlen 是库函数使用前需要包含头文件 s t r i n g . h string.h string.h s t r l e n strlen strlen 是求字符串长度的统计的是 ‘\0’ 之前字符的个数 s t r l e n strlen strlen 关注的是内存中是否有 ‘\0’ 如果不是 ‘\0’ 就会持续往后找可能会越界。 二、数组和指针笔试题解析 2.1、题组一 int a[] { 1,2,3,4,5 };printf(%d\n, sizeof(a));printf(%d\n, sizeof(a 0));printf(%d\n, sizeof(*a));printf(%d\n, sizeof(a 1));printf(%d\n, sizeof(a[1]));printf(%d\n, sizeof(a));printf(%d\n, sizeof(*a));printf(%d\n, sizeof(a 1));printf(%d\n, sizeof(a[0]));printf(%d\n, sizeof(a[0] 1));答案 20 4/8 4 4/8 4 4/8 20 4/8 4/8 4/8 printf(%d\n, sizeof(a)); 数组名单独放在 s i z e o f sizeof sizeof 中这里的数组名代表整个数组计算的是整个数组的大小。答案20printf(%d\n, sizeof(a 0)); 这里虽然 s i z e o f sizeof sizeofa和 s i z e o f sizeof sizeofa 0的计算结果是一样的但他们代表的含义并不一样。 s i z e o f sizeof sizeofa 0中数组名 a a a 并没有单独放此时的数组名表示数组首元素的地址“0” 地址不变这里表示的是个指针变量这个指针指向的是数组首元素。答案4/8printf(%d\n, sizeof(*a)); 这里数组名表示的是数组首元素的地址解引用为数组的元素数组元素类型为 i n t int int。答案4printf(%d\n, sizeof(a 1)); 与上面的 s i z e o f a 0 sizeofa 0 sizeofa0一样都是指针变量只是这里指向的是数组的第二个元素。答案4/8printf(%d\n, sizeof(a[1])); 这个很简单即数组第二个元素类型为 i n t int int等价于*(a 1)printf(%d\n, sizeof(a)); 指针变量指向的是整个数组可访问 20 个字节,虽然是数组指针但只要是指针大小就是4/8。答案4/8printf(%d\n, sizeof(*a)); 这里 和 ∗ * ∗ 互相抵消即 ∗ * ∗ a a即 s i z e o f a ) sizeofa) sizeofa)。答案20printf(%d\n, sizeof(a 1)); 这里是指针变量a为指向整个数组1跳过了整个数组。该指针类型为 i n t int int*[ 5 ]。但这里不是野指针因为 s i z e o f sizeof sizeof 是不会关心访问里面的值的你不能因为我站在银行门口就说我抢银行吧。答案4/8printf(%d\n, sizeof(a[0])); 指针变量指向数组首元素的指针为 i n t ∗ int* int∗ 类型。答案4/8printf(%d\n, sizeof(a[0] 1)); 指针变量直向数组第二个元素的指针只要是指针变量为 i n t ∗ int* int∗ 类型。答案4/8 2.2、题组二 char arr[] { a,b,c,d,e,f };printf(%zd\n, sizeof(arr));printf(%zd\n, sizeof(arr 0)); printf(%zd\n, sizeof(*arr));printf(%zd\n, sizeof(arr[1]));printf(%zd\n, sizeof(arr));printf(%zd\n, sizeof(arr 1));printf(%zd\n, sizeof( arr[0] 1));答案 6 4/8 1 1 4/8 4/8 4/8 printf(%zd\n, sizeof(arr)); 数组名单独放表示整个数组。答案6printf(%zd\n, sizeof(arr 0)); 数组名没有单独放后面有“0”表示的是指向首元素的指针指针变量的大小为 4/8。这里不要因为 c h a r char char 类型大小为 1所以就认为 c h a r ∗ char* char∗ 大小也为 1只要是指针类型它的大小就是 4/8。答案4/8printf(%zd\n, sizeof(*arr)); 表示的是数组首元素类型 c h a r char char。答案1printf(%zd\n, sizeof(arr[1])); 表示的是数组第二个元素类型 char等价于*(arr 1)。答案1printf(%zd\n, sizeof(arr)); 表示的是指向整个数组的指针指针变量的大小为 4/8这里不要以为他是数组类型的指针就以为他是 6只要是指针类型它的大小就是 4/8。答案4/8printf(%zd\n, sizeof(arr 1)); 这题与上面一题类似都是指针变量1跳过了整个数组sizeof不会运算里面的表达式所以这里不算野指针。答案4/8printf(%zd\n, sizeof( arr[0] 1)); 字符指针指向的是数组第二个元素。答案4/8
2.3、题组三 char arr[] { a,b,c,d,e,f };printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 0));printf(%d\n, strlen(*arr));printf(%d\n, strlen(arr[1]));printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 1));printf(%d\n, strlen(arr[0] 1))答案 随机值 随机值 程序无法运行 程序无法运行 随机值 随机值 - 6 随机值 - 1 printf(%d\n, strlen(arr)); 这里 a r r arr arr 表示的是首元素的地址 s t r l e n strlen strlen 函数从首元素开始往后计数什么时候遇到 ‘\0’ 什么时候停下计数停止。答案随机值printf(%d\n, strlen(arr 0)); 这一题与上面的是一样的。答案随机值printf(%d\n, strlen(*arr)); 这里传给 s t r l e n strlen strlen 函数的是数组首元素即 ‘a’字符 ‘a’ 的 ASCII值 为 97。因为 s t r l e n strlen strlen 函数接受的是指针类型的参数所以 s t r l e n strlen strlen 把 ‘a’ 当做地址 0x00000097该地址位于操作系统的内核无法访问。答案程序无法运行printf(%d\n, strlen(arr[1])); 这一题与上面一题同理只是这里传的是 ‘b’。答案程序无法运行printf(%d\n, strlen(arr)); a r r arr arr 是指向整个数组的数组指针虽然类型不同但数值相同分析方法与 s t r l e n a r r strlenarr strlenarr一样。答案随机值printf(%d\n, strlen(arr 1)); a r r arr arr 为数组指针加一跳过了整个数组即跳过了 6 个字符也是与上面一样直到遇到 ‘\0’ 才停止。答案随机值 - 6printf(%d\n, strlen(arr[0] 1)) 字符指针指向首元素地址1 指向第二个元素一直往后数直到 ‘\0’ 。答案随机值 - 1
2.4、题组四 char arr[] abcdef;printf(%d\n, sizeof(arr));printf(%d\n, sizeof(arr 0));printf(%d\n, sizeof(*arr));printf(%d\n, sizeof(arr[1]));printf(%d\n, sizeof(arr));printf(%d\n, sizeof(arr 1));printf(%d\n, sizeof(arr[0] 1));答案 7 4/8 1 1 4/8 4/8 4/8 printf(%d\n, sizeof(arr)); 数组名单独放表示整个数组的大小输入的是字符串后面还跟着 ‘\0’ 。答案7printf(%d\n, sizeof(arr 0)); 数组名不是单独放后面还有一个“0”为指向首元素地址的指针。答案4/8printf(%d\n, sizeof(*arr)); 首元素地址解引用表示数组首元素类型类型为 c h a r char char 。答案1printf(%d\n, sizeof(arr[1])); 表示数组第二个元素等价于 *arr i。答案1printf(%d\n, sizeof(arr)); 数组指针指向整个数组。答案4/8printf(%d\n, sizeof(arr 1)); 数组指针1表 示跳过整个数组但依然是数组指针类型。答案4/8printf(%d\n, sizeof(arr[0] 1)); 字符指针指向数组第二个元素。答案4/8
2.5、题组五 char arr[] abcdef;printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 0));printf(%d\n, strlen(*arr));printf(%d\n, strlen(arr[1]));printf(%d\n, strlen(arr));printf(%d\n, strlen(arr 1));printf(%d\n, strlen(arr[0] 1));答案 6 6 程序无法运行 程序无法运行 6 随机值 5 printf(%d\n, strlen(arr)); 正常传址 s t r l e n strlen strlen 计算该字符串的大小。答案6printf(%d\n, strlen(arr 0)); 与上一题类似 s t r l e n strlen strlen 不会像 s i z e o f sizeof sizeof 那样要区分数组名是否单独存放对 s t r l e n strlen strlen 来说数组名只有地址这一个选项。答案6。printf(%d\n, strlen(*arr)); 这道题前面做过类似的这里传的是 ‘a’ s t r l e n strlen strlen 把‘a’97当做地址但该地址位于操作系统的内核用户无法访问。答案程序无法运行printf(%d\n, strlen(arr[1])); 与上面一题类似。答案程序无法运行printf(%d\n, strlen(arr)); 传递数组指针但数值上等于数组首元素地址从起始位置开始一个个往后计数直到一段遇到 ‘\0’ 停止。答案6。printf(%d\n, strlen(arr 1)); 数组指针1 则跳过整个数组从数组末尾开始计数什么时候遇到 ‘\0’ 什么时候停下。答案随机值printf(%d\n, strlen(arr[0] 1)); 字符指针1 跳过首元素第二个元素开始往后计数直到遇到 ‘f‘ 后面的 ‘\0’。答案5。
2.6、题组六 comst char* p abcdef;printf(%d\n, sizeof(p));printf(%d\n, sizeof(p 1));printf(%d\n, sizeof(*p));printf(%d\n, sizeof(p[0]));printf(%d\n, sizeof(p));printf(%d\n, sizeof(p 1));printf(%d\n, sizeof(p[0] 1));答案 4/8 4/8 1 1 4/8 4/8 4/8 printf(%d\n, sizeof(p)); p p p 是字符指针大小为 4/8 字节很简单。答案4/8printf(%d\n, sizeof(p 1)); 与上面一样指针1 还是指针。答案4/8printf(%d\n, sizeof(*p)); p p p 本质是存放字符串首元素的地址即 ‘a’ 的地址 p p p 解引用得到 ‘a’ 为 c h a r char char 类型大小为一个字节。答案1printf(%d\n, sizeof(p[0])); 这一句与上面的是一样的。答案1printf(%d\n, sizeof(p)); 取出 p p p 的地址为二级指针本质还是指针。答案4/8printf(%d\n, sizeof(p 1)); 二级指针 1本质还是指针变量。答案4/8printf(%d\n, sizeof(p[0] 1)); p[0] 1 *p 0) 1即 p 1还是指针变量。答案4/8
2.7、题组七 char* p abcdef;printf(%d\n, strlen(p));printf(%d\n, strlen(p 1));printf(%d\n, strlen(*p));printf(%d\n, strlen(p[0]));printf(%d\n, strlen(p));printf(%d\n, strlen(p 1));printf(%d\n, strlen(p[0] 1));答案 6 5 程序无法运行 程序无法运行 随机值 随机值 5 printf(%d\n, strlen(p));正常传址正常计算字符串的大小。答案6printf(%d\n, strlen(p 1));从第二个字符开始计算字符串的大小。答案5printf(%d\n, strlen(*p));*p就是‘a’-97。答案程序无法运行printf(%d\n, strlen(p[0]));p[ 0 ] *(p 0) *p。答案程序无法运行printf(%d\n, strlen(p));p 取出的是 p 这个指针变量的地址是二级指针与字符串 “abcdef” 的关系就不大了。从 p 这个变量的地址开始往后数什么时候遇到 ‘\0’ 什么时候停但这一切都是未知。答案随机值printf(%d\n, strlen(p 1));也是一样的1 跳过了 4/8 的字节但是一切依然是未知的。答案随机值printf(%d\n, strlen(p[0] 1));p[ 0 ]为取出首个字符的地址1即第二个字符的地址。答案5
2.8、题组八
int a[3][4] { 0 };printf(%d\n, sizeof(a));
printf(%d\n, sizeof(a[0][0]));
printf(%d\n, sizeof(a[0]));
printf(%d\n, sizeof(a[0] 1));
printf(%d\n, sizeof(*(a[0] 1)));
printf(%d\n, sizeof(a 1));
printf(%d\n, sizeof(*(a 1)));
printf(%d\n, sizeof(a[0] 1));
printf(%d\n, sizeof(*(a[0] 1)));
printf(%d\n, sizeof(*a));
printf(%d\n, sizeof(a[3]));答案 48 4 16 4/8 4 4/8 16 4/8 16 16 16 printf(%d\n, sizeof(a)); 数组名单独放在 s i z e o f sizeof sizeof 中表示整个数组的大小。答案48printf(%d\n, sizeof(a[0][0])); 表示的是数组第一行的首元素类型为 i n t int int 。答案4printf(%d\n, sizeof(a[0])); a[0] 可看成第一行这个一维数组的数组名数组名单独放在 s i z e o f sizeof sizeof 中表示整个数组的大小。答案16printf(%d\n, sizeof(a[0] 1)); 第一行的数组名并没有单独放在 s i z e o f sizeof sizeof 中因此这里的 a[0] 表示的是第一行首元素的地址1 则为第二个元素地址但都是指针变量。答案4/8printf(%d\n, sizeof(*(a[0] 1))); a[0] 1上面已经分析过了即第一行第二个元素现在进行解引用为 i n t int int 类型。答案4printf(%d\n, sizeof(a 1)); 数组名不是单独放置这里的 a a a 表示的是数组首元素的地址二维数组首元素为第一行1指向第二行的地址但都是指针变量。答案4/8printf(%d\n, sizeof(*(a 1))); a 1上面已经分析过了即第二行的地址现在对其解引用即整个第二行类型为 i n t int int[ 3 ]。答案16printf(%d\n, sizeof(a[0] 1)); a[0] 为第一行数组的数组名对其进行 操作取出的是整个第一行数组的地址1即指向第二行数组的指针。也可以这样看 a[0] 1 (*(a 0)) 1 * a 1 a 1而 a 1 前面已经分析过了。答案4/8printf(%d\n, sizeof(*(a[0] 1))); a[0] 1 上面刚刚分析过为指向第二行数组的指针对其进行解引用为第二行数组。答案16printf(%d\n, sizeof(*a)); 这里 a a a 不是单独放代表首元素的地址即第一行数组的地址对其进行解引用得到第一行数组。答案16printf(%d\n, sizeof(a[3])); a[3] 与 a[0] 是一样的因为 s i z e o f sizeof sizeof 并不会对里面的表达式进行实际的匀运算所以并不算错。答案16
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87176.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!