上一节,我们了解了sizeof计算符和strlen函数的定义,接下来我们加强对它们的理解

首先,写一串代码,分析程序执行的结果,并分析原因

int main()
{char arr[] = "abcdef";printf("%d\n", sizeof(arr));          1 printf("%d\n", sizeof(arr+0));        2printf("%d\n", sizeof(*arr));         3printf("%d\n", sizeof(arr[1]));       4printf("%d\n", sizeof(&arr));         5printf("%d\n", sizeof(&arr+1));       6printf("%d\n", sizeof(&arr[0]+1));    7return 0;
}

一:7 首先,sizeof(arr)中的arr表示整个数组,数组内部的元素是字符串,所以内部的元素实际上是"abcdef/0"; 6个字母加上一个/0 ,一共七个元素,因为元素类型是char类型,所以一个元素所占的字节数为1,7个元素所占的字节数就为7.

二:4(32位平台) sizeof(arr+0)不表示整个数组,只有严格格式的sizeof(arr)中的arr才表示整个数组,所以这里的arr表示数组首元素的地址,既然是指针,一个指针所占的字节数为4(32位平台)

三:1 arr表示数组首元素的地址,*arr表示数组首元素,数组首元素为a,类型是char型,所以a所占的字节数为1

四:1 arr[1]表示数组第二个元素,第二个元素为b,类型为char型,所以所占的字节数也为1

五:4 &+数组名表示数组的地址,这里将数组的地址传递过去,既然是指针,所占的字节数就为4

六:4 &arr表示数组的地址,数组的地址+1表示跳过整个数组 但还是地址,所以占的字节数为4

七:4 &arr[0]表示数组首元素的地址,首元素地址+1表示数字第二个元素的地址,是地址,所以占的字节数就为4

所以打印的结果应该是 7 4 1 1 4 4 4

结果正确

同样的数组,我们使用strlen函数验证一下

int main()
{char arr[] = "abcdef";printf("%d\n", strlen(arr));       1printf("%d\n", strlen(arr+0));     2printf("%d\n", strlen(*arr));      3printf("%d\n", strlen(arr[1]));    4printf("%d\n", strlen(&arr));      5printf("%d\n", strlen(&arr+1));    6printf("%d\n", strlen(&arr[0]+1)); 7return 0;}

代码如图所示

我们继续分析

一:6 strlen在计算时,是不计入/0的,/0只是strlen函数结束的标志,我们把数组首元素的地址传递过去,strlen函数运行,直到发现/0 一共六个元素,abcdef,每个元素所占的字节数都为1,所以结果为6

二:6 分析的过程和结果都和1相同

三:报错 arr表示数组首元素的地址,*表示对它进行解引用,*arr是数组首元素,数组首元素为a,strlen函数一般识别的是地址,a对应的ascii码是97,97对应的地址不在我们使用的范围内,形成越界访问,所以报错,结果如图所示

四:报错 arr[2]表示数组第二个元素,数组第二个元素为b,b对应的ascii码值为98 ,98对应的地址不在我们的使用范围内,所以会形成越界访问,和三的结果相同

五:6 但会发生警告 ,因为&arr表示数组的地址,用代码表示就是char(*)[7],strlen函数的参数是(const char*),两个的类型不相同,不兼容,但依然能够强行赋值

六:随机值 &arr表示数组的地址,+1表示跳过数组的地址,也就是跳过了/0,下一个/0的位置是未知的,所以是随机值,也会产生和五相同的警告,警告的原因也是相同的,因为strlen函数的参数与我们的数组指针不兼容

七:5 &arr[0]表示数组首元素的地址,+1表示数组第二个元素的地址,也就是从b开始,到/0结束,一共是五个char类型的元素,所以是五个字节

int main()
{char*p = "abcdef";printf("%d\n", sizeof(p));             1printf("%d\n", sizeof(p+1));           2printf("%d\n", sizeof(*p));            3printf("%d\n", sizeof(p[0]));          4printf("%d\n", sizeof(&p));            5printf("%d\n", sizeof(&p+1));          6printf("%d\n", sizeof(&p[0]+1));       7return 0;
}

首先,要对char*p = "abcdef";进行解释

答: "abcdef"(char型)一共占用六个字节,但是正常的指针只占用4个字节,所以不能按照正常的解释:这里的"abcdef";是常量字符串:可以被访问,不允许通过解引用操作更改 这里的p是对应的是首元素的地址,即a的地址。

一:4 p这里表示首元素的地址,即a的地址,一个指针占四个字节,

二:4 p+1的得到的是数组第二个元素的地址,一个指针占四个字节

三:1 这里我们可以这样解释 :数组的第二个元素正常情况下应该怎样表示,有两种表示方法,1:arr[1] 2:*(arr+1)   类比可得*p=*(p+0)=arr[1] 所以这里表示数组首元素,数组首元素为a,所占的字节数为1

四:1 这里也可以类比  arr[0]表示数组首元素  所以p[0]也表示数组首元素,所占的字节数为1

五:4 &p可以类比&arr,所以这里表示数组的地址,无论是什么地址,所占的字节数都是固定的

六:4 &p表示数组的地址,&p+1表示跳过p数组的地址,因为是地址,所占的字节数不变。

七:4 &p[0]等价于&arr[0]表示数组首元素的地址,首元素的地址+1表示数组第二个元素的地址,因为是地址,所以所占的字节数为4

总结:遇到这种常量字符串对应的指针(p),可以用他们类比于arr计算

int main()
{char*p = "abcdef";printf("%d\n", strlen(p));                 1printf("%d\n", strlen(p+1));               2printf("%d\n", strlen(*p));                3printf("%d\n", strlen(p[0]));              4printf("%d\n", strlen(&p));                5printf("%d\n", strlen(&p+1));              6printf("%d\n", strlen(&p[0]+1));           7return 0;
}

对结果进行分析

这里的p是数组首元素的地址

一:6 p在这里的意思是首元素的地址 从a到/0一共6个元素,占6个字节

二:5 p+1表示第二个元素的地址

三:err 在这里表示首元素 因为strlen只能接收地址,所以发生错误

四:err 在这里也表示数组首元素

五:随机值 p是首元素的地址,&p表示到地址内部,例如p的地址是0x000016 ,,如果是小端存储,就是16 00 00 0x 第二个就是/0  /0所以根据地址的不同而发生变化 所以是随机值

六:随机值

七:4 &p[0]表示数组首元素的地址 +1表示数组第二个元素的地址

c语言指针详解 第38课相关推荐

  1. c语言的指针详解ppt,最全的C语言指针详解.ppt

    最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...

  2. C语言指针详解(全解)—— 前篇

    关于指针的基本概念及相关运算写在了上一篇博客 C语言指针详解(初级)_Seinrich的博客-CSDN博客 本篇博客来详细的解说一下指针,深入探讨指针 一.指针与const const修饰的变量为常变 ...

  3. C语言指针详解——入门C语言指针,初级指针使用。

    原文地址:我的个人博客点击查看 C语言教程第二弹--指针详解 所有学过C语言的人都知道,C语言难在它的指针的使用和理解,今天,我带给大家C语言的指针的教程,供大家学习交流,如果有讲的不对的地方,请给作 ...

  4. c语言 指针_C 语言指针详解

    (给CPP开发者加星标,提升C/C++技能) 作者:C语言与CPP编程 / 自成一派123(本文来自作者投稿) 1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直 ...

  5. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)

    C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的 ...

  6. c语言高低位拷贝_C语言指针详解

    1为什么使用指针 假如我们定义了 char a='A' ,当需要使用 'A' 时,除了直接调用变量 a ,还可以定义 char *p=&a ,调用 a 的地址,即指向 a 的指针 p ,变量 ...

  7. 导航编程用c语言还是c加加,C语言/C加加大神程序员老司机带你玩转C语言指针详解...

    很多初学编程的小伙伴都会选择C语言作为第一门学习的编程语言,因为C语言作为一门底层基础语言相对于其他的高层语言来说更加容易学习.可以来帮助正在学习编程的小伙伴更加快速的了解计算机原理. 但是初学C语言 ...

  8. C语言指针详解(新手入门推荐)

    目录 指针的理解 字符指针:char * 无类型指针void * 指针数组 数组指针 函数指针 回调函数 函数指针数组 练习 指针和数组笔试题解析 指针的理解 关于指针,我先讲一个故事:一个侦探在案发 ...

  9. C语言指针详解——后篇

    目录 一.指针与数组 ​编辑 二.数组传参 2.1一维数组传参 2.2二维数组传参 三.函数指针及应用 四.函数指针数组 一.指针与数组 先来看以下代码及运行的结果 #include <stdi ...

最新文章

  1. 又一个Jupyter神器,操作Excel自动生成Python代码
  2. 数据中心基础设施:建设与设计
  3. linux环境下安装mysql 8.0
  4. 图书资料管理课程设计(附源码和连接)
  5. linq之join子句
  6. Raising Modulo Numbers
  7. Spring Cloud Gateway(五):路由定位器 RouteLocator
  8. 怎么修改db2服务器名字,服务器创建db2数据库实例名
  9. python手机销售系统结论于心得_python实现手机销售管理系统
  10. 微信小程序-图片放大与缩小
  11. 计算机网络常见简答题
  12. win10计算机系统优化设置,win10系统电脑如何进行系统优化
  13. proxy 配置报错 Error occured while trying to proxy to:
  14. 老鸟程序员才知道的一些事
  15. nexus私服安装包
  16. Java相对路径与类路径详解
  17. 【毕设项目】基于STM32F103ZET6的土壤温湿度数据采集和存储系统
  18. [HoopChina]爱神的通牒
  19. Android VLC音频视频播发器快速集成教程与模块
  20. MySQL安全性:防止攻击和保护数据

热门文章

  1. 科研图像压缩算法比例,雷娜_对tinders算法的不科学研究
  2. 从零开始构建简易AI问答系统
  3. uni-app(android、ios) 使用蓝牙便携式打印机(热敏打印机)
  4. 内衣品牌BODY JAZZ引领时尚潮流,喜提中文名
  5. 2018年 春耕行情 收获200W RMB 内衣外贸 接单 挖客 (普宁电商外贸)
  6. python粉色倒三角形_python – 颠倒的星号三角形
  7. 创业也好,打工也罢,都需要持之以恒的“笨功夫”
  8. jsp中表格序号递增,varStatus=“vs“
  9. 【iOS】Instruments性能检测之耗电优化
  10. 作为新人,如何快速融入新团队?用好这8个点