提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
1. sizeof和strlen的对比
1.1sizeof
1.2 strlen
1.3 sizeof 和 strlen的对比
2. 数组和指针笔试题解析
2.1 一维数组
2.2 字符数组
2.3 二维数组
3. 指针运算笔试题解析
3.1 题目1:
3.2 题目2
3.3 题目3
3.4 题目4
3.5 题目5
3.6 题目6
3.7 题目7
总结
前言
世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!
想回顾上一节的请点击这里深入指针4
提示:以下是本篇文章正文内容,下面案例可供参考
1. sizeof和strlen的对比
1.1sizeof
在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
size_t其实是专门设计给sizeof的,表示sizeof的返回类型
sizeof在计算大小的时候,其实是根据类型来推算的
sizeof的操作数如果是一个表达式,表达式是不会参与计算的!!!
代码演示:
1.2 strlen
strlen 是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( const char * str );
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会以直向后找 \0 字符,直到找到为止,所以可能存在越界查找。
1.3 sizeof 和 strlen的对比
sizeof
1. sizeof是操作符
2. sizeof计算操作数所占内存的大小,单位是字节
3. 不关注内存中存放什么数 据
strlen
1. strlen是库函数,使用需要包含头文件 string.h
2. strlen是求字符串长度的,统计的是 \0 之前字符的个数
3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界
2. 数组和指针笔试题解析
数组名的理解:
通常情况下,数组名表示数组首元素的地址
但是有两个例外:
1:sizeof(数组名),数组名表示的是整个数组,计算的是整个数组的大小,单位是字节
2:&数组名,数组名表示的是整个数组,取出的是整个数组的地址
2.1 一维数组
2.2 字符数组
strlen()函数只能是地址传递进来,不能直接是字符
第一题:
第二题:
第三题:
&arr是整个数组的地址,+1是跳过整个数组的地址(指向\0之后的地址)
第四题:
arr是首元素的地址,*arr就是'a',只要传进去的不是地址,就是非法访问,程序就会报错,程序会提前结束。
第五题:
常量字符串可以近似的看成是一个数组,p存放的是首字符的地址,数组名也是首字符的地址,所以p可以看成数组名
int* p;
*p - 访问一个整型的大小
p + 1 - 跳过一个整型
char* p;p的类型是char*
char* * pp = &p,pp的存放的是p的地址(pp可以看成&p),*说明pp是指针,pp的类型是char**,pp指向的对象是p,p的类型是char*
pp+1和&p+1是一样的,都跳过char*类型的大小
+1一般都是跳过这个指针指向的对象的类型(指针的对象:指针通过地址,找到地址所对应的对象)
第五题:
2.3 二维数组
3. 指针运算笔试题解析
3.1 题目1:
3.2 题目2
3.3 题目3
逗号表达式:
从左向右一次计算
但是整个表达式的结果是最后一个表达式的结果
3.4 题目4
//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
return 0;
}
-4在内存中以补码的形式存在,以%p的形式打印,认为内存中存放的是地址,地址是不存在原反补的,直接把-4的补码打印出来就行了
以%d的形式打印,就是把-4的原码形式显示在屏幕上
3.5 题目5
3.6 题目6
常量字符串的值是首字符的地址
3.7 题目7
还有另一个意思是:解引用之后是c+2指向的对象,对象是c数组中下标为2的地址;第二次解引用之后是'p'地址所指向的对象,对象是p。因为是%s的形式打印,所以是POINT
总结
好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。