【深入理解指针5】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!

想回顾上一节的请点击这里深入指针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


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

猜你喜欢

转载自blog.csdn.net/2301_79585944/article/details/134217639