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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【C指针】深入理解指针(最终篇)数组&&指针&&指针运算题解析(一)

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


细解:


  1. printf(“%d\n”, sizeof(arr)); //6
    sizeof单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节.,6个字节
  2. printf(“%d\n”, sizeof(arr + 0));// 4/8
    arr+0 是数组第一个元素的地址,是地址,大小就是4/8个字节
  3. printf(“%d\n”, sizeof(* arr));// 1*
    *arr是首元素,计算的是首元素的大小,字符a的类型是char,是1个字节
  4. printf(“%d\n”, sizeof(arr[1]));// 1
    arr[1] 是第二个元素字符b,类型是char是1个字节
  5. printf(“%d\n”, sizeof(&arr));//4/8
    &arr取得是整个数组的地址,是地址,大小就是4/8个字节。
  6. printf(“%d\n”, sizeof(&arr + 1));//4/8
    &arr取得是整个数组的地址,&arr+1跳过整个数组,跳过了6个数组的元素,指向f后面,也是地址,大小就是4/8个字节。

🎈🎈🎈strlen计算字符数组

int main()
{
  char arr[] = { 'a','b','c','d','e','f' };
  printf("%d\n", strlen(arr));
  printf("%d\n", strlen(arr + 0));
  printf("%d\n", strlen(*arr));
  printf("%d\n", strlen(arr[1]));
  printf("%d\n", strlen(&arr));
  printf("%d\n", strlen(&arr + 1));
  printf("%d\n", strlen(&arr[0] + 1));
  
}

rintf(“%d\n”, strlen(arr));//随机值

arr为数组名,也就是数组首元素的地址,但是字符数组中没有\0,strlen将会继续查找\0,但是\0是不知道在什么位置出现,所以无法计算,为随机值。

printf(“%d\n”, strlen(arr + 0));//随机值

arr+0也是数组首元素的地址,但是字符数组中没有\0,strlen将会继续查找\0,但是\0是不知道在什么位置出现,所以无法计算,为随机值。并且与前面的随机值一样

  1. printf(“%d\n”, strlen(*arr));//非法访问
                       //'a'-97
  //printf("%d\n", strlen(*arr));//err
  //                   //'b'-98
  //printf("%d\n", strlen(arr[1]));//err

注意

*arr取出来的是字符a,字符a对应的ASCII码值为97,而97为内存空间里的一个地址,

size_t strlen ( const char * str );,内存空间这块97地址传给strlen,strlen能直接访问这块不属于他的空间吗?

答案是不可以,因为它不属于strlen的作用域==一旦访问了就成非法访问了。(当然,arr[1]也是如此)

printf(“%d\n”, strlen(arr[1]));//非法访问

注意

*arr1[1]取出来的是字符b,字符a对应的ASCII码值为98,而98为内存空间里的一个地址,

size_t strlen ( const char * str );,内存空间这块97地址传给strlen,strlen能直接访问这块不属于他的空间吗?

答案是不可以,因为它不属于strlen的作用域一旦访问了就成非法访问了,编译器就会报错–>访问冲突。



printf(“%d\n”, strlen(&arr));//随机值

&arr虽然是数组的地址,但是也是指向数组的起始位置,那就是从数组首元素开始找嘛,没有\0,找不到,那就是随机值了


printf(“%zd\n”, strlen(&arr + 1));//随机值-6

&arr+1跳过整个数组,也就是跳过6个char类型的元素从f后面的地址开始查找\0,因此相比从头开始找少了6个元素



printf(“%d\n”, strlen(&arr[0] + 1));//随机值-1

&a[0] + 1 是第二个元素的地址,比随机值少一个元素a


字符串数组

💮 💮 sizeof计算字符串数组

int main()
{
  char arr[] = "abcdef";

  printf("%zd\n", sizeof(arr));
  printf("%zd\n", sizeof(arr + 0));
  printf("%zd\n", sizeof(*arr));
  printf("%zd\n", sizeof(arr[1]));
  printf("%zd\n", sizeof(&arr));
  printf("%zd\n", sizeof(&arr + 1));
  printf("%zd\n", sizeof(&arr[0] + 1));

  return 0;
}

解析:char arr[] = “abcdef\0”//字符串别忘记有\0,也占用一个char空间printf(“%zd\n”, sizeof(arr));//7

数组名arr单独放,计算的是整个数组的大小,7个字节

printf(“%zd\n”, sizeof(arr + 0));//4/8

arr+0是数组首元素的地址,地址的大小是4/8个字节

printf(“%zd\n”, sizeof(*arr));//1

*arr是数组的首元素,这里计算的是首元素(a)的大小 ,类型为char,大小为1

printf(“%zd\n”, sizeof(arr[1]));//1

*arr是数组的首元素,这里计算的是第二个元素(b)的大小 ,大小为1

printf(“%zd\n”, sizeof(&arr));//4/8

&arr - 是数组的地址,数组的地址也是地址,是地址就是4/8个字节

printf(“%zd\n”, sizeof(&arr + 1));//4/8

&arr+1,跳过整个数组,指向了数组的后边,4/8

printf(“%zd\n”, sizeof(&arr[0] + 1));//4/8

&arr[0] + 1是第二个元素的地址 是地址,那就是4/8

小结

sizeof计算变量或类型的大小,单位是字节(byte)。%zd格式说明符用于打印size_t类型的值,这也是sizeof的返回类型。

字符串常量"abcdef"实际上是一个char数组,最后一个元素是'\0'。所以sizeof(arr)算出的是整个字符串占用的空间,包含结束符,即7个字节。

当sizeof操作数是数组时,它计算的是整个数组占用的字节数。当操作数是指针时,它计算的是指针变量本身占用的字节数,与它指向的对象大小无关。


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

相关文章
|
7天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
18 3
|
6天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
13 2
|
14天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
23 1
|
24天前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
24天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
24天前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
24天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
20 0
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
3月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)

推荐镜像

更多
下一篇
无影云桌面