当前位置: 首页 > news >正文

初学c语言14(指针6)

一.sizeof和strlen的对比

1.sizeof

操作符,计算变量所占空间大小

2.strlen

库函数,函数原型为

求的是字符串的长度,统计的是“\0”之前的字符个数

二.指针和笔试题解析

补充:数组名的意义

1.sizeof(数组名)

这里表示整个数组,计算的是整个数组所占空间的大小

2.&数组名

这里表示整个数组,取出的是整个数组的地址

3.其他

表示首元素的地址

1.一维数组

代码:

#include <stdio.h>
int main()
{printf("%zu\n",sizeof(a));printf("%zu\n",sizeof(a+0));printf("%zu\n",sizeof(*a));printf("%zu\n",sizeof(a+1));printf("%zu\n",sizeof(a[1]));printf("%zu\n",sizeof(&a));printf("%zu\n",sizeof(*&a));printf("%zu\n",sizeof(&a+1));printf("%zu\n",sizeof(&a[0]));printf("%zu\n",sizeof(&a[0]+1));
}

解释:

2.字符指针

例 2.1:

代码:

#include <stdio.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%zu\n", sizeof(arr));printf("%zu\n", sizeof(arr + 0));printf("%zu\n", sizeof(*arr));printf("%zu\n", sizeof(arr[1]));printf("%zu\n", sizeof(&arr));printf("%zu\n", sizeof(&arr + 1));printf("%zu\n", sizeof(&arr[0] + 1));return 0;
}

解释:

例2.2

代码:

#include <stdio.h>
#include <string.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%zu\n", strlen(arr));printf("%zu\n", strlen(arr + 0));printf("%zu\n", strlen(*arr));printf("%zu\n", strlen(arr[1]));printf("%zu\n", strlen(&arr));printf("%zu\n", strlen(&arr + 1));printf("%zu\n", strlen(&arr[0] + 1));return 0;
}

解释:

例2.3

代码:

#include <stdio.h>
int main()
{char arr[] = "abcdef";printf("%zu\n", sizeof(arr));printf("%zu\n", sizeof(arr + 0));printf("%zu\n", sizeof(*arr));printf("%zu\n", sizeof(arr[1]));printf("%zu\n", sizeof(&arr));printf("%zu\n", sizeof(&arr + 1));printf("%zu\n", sizeof(&arr[0] + 1));return 0;
}

解释:

例2.4

代码:

#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "abcdef";printf("%zu\n", strlen(arr));printf("%zu\n", strlen(arr + 0));printf("%zu\n", strlen(*arr));printf("%zu\n", strlen(arr[1]));printf("%zu\n", strlen(&arr));printf("%zu\n", strlen(&arr + 1));printf("%zu\n", strlen(&arr[0] + 1));return 0;
}

解释:

例2.5

代码:

#include <stdio.h>
int main()
{char* p = "abcdef";printf("%zu\n", sizeof(p));printf("%zu\n", sizeof(p + 1));printf("%zu\n", sizeof(*p));printf("%zu\n", sizeof(p[0]));printf("%zu\n", sizeof(&p));printf("%zu\n", sizeof(&p + 1));printf("%zu\n", sizeof(&p[0] + 1));return 0;
}

解释:

例2.6

代码:

#include <stdio.h>
#include <string.h>
int main()
{char* p = "abcdef";printf("%zu\n", strlen(p));printf("%zu\n", strlen(p + 1));printf("%zu\n", strlen(*p));printf("%zu\n", strlen(p[0]));printf("%zu\n", strlen(&p));printf("%zu\n", strlen(&p + 1));printf("%zu\n", strlen(&p[0] + 1));return 0;
}

解释:

3.二维数组

代码:

#include <stdio.h>
int main()
{int a[3][4] = { 0 };printf("%zu\n", sizeof(a));printf("%zu\n", sizeof(a[0][0]));printf("%zu\n", sizeof(a[0]));printf("%zu\n", sizeof(a[0] + 1));printf("%zu\n", sizeof(*(a[0] + 1)));printf("%zu\n", sizeof(a + 1));printf("%zu\n", sizeof(*(a + 1)));printf("%zu\n", sizeof(&a[0] + 1));printf("%zu\n", sizeof(*(&a[0] + 1)));printf("%zu\n", sizeof(*a));printf("%zu\n", sizeof(a[3]));return 0;
}

解释:

注意:sizeof计算变量、数组的大小是,是通过内存推导的,不会真实访问内存空间

三.练习

例1:

include <stdio.h>int main(){int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;}

解释:

例2:

代码:

#include <stdio.h>int main(){int a[3][2] = { (0, 1), (2, 3), (4, 5) };int *p;p = a[0];printf( "%d", p[0]);return 0;}

解释:

例3:

#include <stdio.h>int main(){int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 = (int *)(&aa + 1);int *ptr2 = (int *)(*(aa + 1));printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;}

解释:

例4:

代码:

#include <stdio.h>int main(){char *a[] = {"work","at","alibaba"};char**pa = a;pa++;printf("%s\n", *pa);return 0;}

解释:

相关文章:

  • CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】
  • SpringBoot Vue MySQL酒店民宿预订系统源码(支付宝沙箱支付)+代码讲解视频
  • 【Linux】Linux 的管道与重定向的理解
  • 监控易一体化运维:网络流量分析的智慧引擎
  • 使用Git+Cron实现BIND的Named域名配置自动化管理!
  • java加强 -File
  • 【Java-EE进阶】SpringBoot针对某个IP限流问题
  • 【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)
  • 【设计模式】- 创建者模式
  • 【AI面试秘籍】| 第9期:Transformer架构中的QKV机制深度解析:从原理到实践实现
  • SparkSQL操作MySQL
  • 【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析
  • 深入解析JVM字节码解释器执行流程(OpenJDK 17源码实现)
  • 小程序 存存上下滑动的页面
  • BMS工具箱用来执行贝叶斯模型平均(BMA)计算模块
  • 中国版Cursor | 我用CodeBuddy Craft 3分钟复刻NFC经典游戏
  • 性能比拼: Nginx vs. Envoy
  • 《Python星球日记》 第69天:生成式模型(GPT 系列)
  • web第三次课后作业--基于JDBC对mysql数据库的增删查改操作
  • 主题切换方案
  • 知名猎头公司创始人兼首席执行官庄华因突发疾病逝世,享年62岁
  • 网约车座椅靠背张贴“差评者得癌症”,如祺出行:未收到投诉无法处理
  • 上海国际电影节纪录片单元,还世界真实色彩
  • 将人工智能送上太空,我国太空计算卫星星座成功发射
  • 广东省中医院脾胃病科大科主任张北平病逝,年仅52岁
  • 乌方:泽连斯基只接受与普京会谈,拒见其他俄代表