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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【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

相关文章
|
2月前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
65 5
|
24天前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
28天前
|
存储 Java 开发者
【编程基础知识】 计算机中的数学魔法:二进制加减运算全解析
本文深入解析了计算机中二进制加减运算的原理,涵盖原码、反码和补码的概念及应用,结合具体示例,帮助读者理解计算机底层数学运算机制,适合Java开发者学习。
40 0
|
30天前
|
人工智能
魔法指针 之 指针变量的意义 指针运算
魔法指针 之 指针变量的意义 指针运算
16 0
|
1月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
3月前
|
存储 JavaScript 前端开发
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
20 0
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
3月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)

推荐镜像

更多
下一篇
无影云桌面