【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)1

简介: 【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)

1️⃣ sizeof和strlen的对⽐

➡️sizeof

C语言中sizeof不是一个函数,而是一个编译期计算类型大小的内置操作符,所以它没有函数原型。

sizeof没有函数原型,它的语法形式是:

sizeof(类型名)
sizeof 变量名

类型名需要括号,变量名可以不需要括号。直接写类型名后面会报错。

sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。

int main()
{
  int a = 66;
  printf("%zd\n", sizeof(a));//4
  printf("%zd\n", sizeof(int));//4
  printf("%zd\n", sizeof a);//这里可以省略括号
  printf("%zd\n", sizeof int);//err,类型名本身不能直接跟在sizeof后面,如sizeof int是错误的
  return 0;
}

当然,sizeof也可以求数组的大小


数组名就是数组⾸元素(第⼀个元素)的地址。

sizeof(数组名)---->sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节.

&数组名(如&a),这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素

除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。

int main()int main()
{
  int arr1[4] = { 0 };
  char arr2[4] = { 0 };
  printf("%zd\n", sizeof(arr1));//16    //单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩
  printf("%zd\n", sizeof(int [4]));//16  //int占用4个字节,int[4]数组占用4 * 4 = 16字节

  printf("%zd\n", sizeof(arr2));//4        //单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩
  printf("%zd\n", sizeof(char [4]));//4  //arr2是char类型的数组,char占1字节,char[4]数组占用4 * 1 = 4字节。

  return 0;
}

➡️ ➡️ strlen

strlen 是C语⾔库函数,功能是求字符串⻓度。函数原型如下:

size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。

strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找。

int main()
{
  char arr1[20] = "abcdef";
  size_t len = strlen(arr1);//不包含结尾'\0',所以长度是6。
  printf("len = %zd\n", len);

  size_t sz = sizeof(arr1);//arr1这个数组变量占用的内存大小,即20字节。
  printf("sz = %zd\n", sz);

  char arr2[] = { 'a', 'b','c' };
  printf("%zd\n", strlen(arr2));//随机值,因为找不到\0
  
  char arr3[6] = "abcdef";//err
    //因为"abcdef"包含7个字符及结尾'\0',大于arr3的空间6字节,会导致越界。
  return 0;
}

➡️ ➡️ ➡️sizeof 和 strlen的对⽐

2️⃣ 数组和指针笔试题解析

💯 ⼀维数组

数组名就是数组⾸元素(第⼀个元素)的地址。

sizeof(数组名)---->sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节.

&数组名(如&a),这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素

的地址是有区别的)

除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。


char* arr1[10];     //存放字符指针的指针数组

int* arr2[10];      //存放整型指针的指针数组

int(*arr3[5])[6]  ;//存放数组指针的数组指针数组

int(*arr4[5])(int);//存放函数指针的函数指针数组

int main()
{
  int a[] = { 6,7,8,9,10 };
  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));
}

细解:


  1. printf(“%d\n”, sizeof(arr));//20
  2. sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节.
  3. printf(“%zd\n”, sizeof(a + 0));4/8
  4. a没有单独放在sizeof内部,也没有&取地址,因此a表示的就是数组首元素的地址,a+0还是首元素的地址 ,是地址,那么大小就是 4/8,地址大小只与环境有关,32位是4个字节,64位就是8个字节
  5. printf(“%zd\n”, sizeof(*a)); //4
  6. a表示的就是数组首元素的地址,*a 就是首元素,首元素是6,6的类型是int,大小就是4个字节
  7. printf(“%zd\n”, sizeof(a + 1));//4/8
  8. a表示的就是数组首元素的地址,a+1就是第二个元素的地址,这里的计算的是第二个元素的地址的大小,地址大小只与环境有关,32位是4个字节,64位就是8个字节4/8
  9. printf(“%zd\n”, sizeof(a[1]));//4
  10. a[1]是数组的第二个元素(7),大小是4个字节
  11. printf(“%zd\n”, sizeof(&a));//4/8
  12. &a - 取出的是数组的地址,但是数组的地址也是地址,是地址,大小就是4/8个字节
  13. printf(“%zd\n”, sizeof(*&a));//20
  14. 两种方法:1. & 和 * 抵消
  15. 2.&a 的类型是数组指针,int(*)[5],*&a就是对数组指针解引用访问一个数组的大小,是20个字节
  16. printf(“%zd\n”, sizeof(&a + 1));//4/8
  17. &a+1是跳过整个数组后的一个地址,是地址,大小就是4/8个字节
  18. printf(“%zd\n”, sizeof(&a[0]));//4/8
  19. &a[0]是数组第一个元素的地址,是地址,大小就是4/8个字节
  20. printf(“%zd\n”, sizeof(&a[0] + 1));//4/8

  &a[0] + 1 是第二个元素的地址,大小就是4/8个字节

🎈字符数组

🎈🎈 sizeof计算字符数组

int main()
{
  char arr[] = { 'a','b','c','d','e','f' };
  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));
  return 0;
}



【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)2:  https://developer.aliyun.com/article/1474745

目录
打赏
0
52
51
27
82
分享
相关文章
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
57 7
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
215 1
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
8月前
|
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
177 4
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
391 29
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多
  • DNS
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问