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

简介: 【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

相关文章
|
2天前
|
存储 人工智能
指针的应用练习(数组与指针的关系)
指针的应用练习(数组与指针的关系)
11 0
|
2天前
|
存储 人工智能
字符指针变量和字符数组注意事项(区别)
字符指针变量和字符数组注意事项(区别)
6 0
|
2天前
指针的基础应用(数组的颠倒和排序,二维数组的表示)
指针的基础应用(数组的颠倒和排序,二维数组的表示)
7 0
数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
数组指针、函数指针、指针数组、函数 指针数组、指针函数详细总结
|
2天前
|
Java
解析java中的数组
解析java中的数组
13 3
|
2天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
2天前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针
|
2天前
指针指向数组
指针指向数组
17 0
|
2天前
|
C语言 C++
C语言:指针运算笔试题解析(包括令人费解的指针题目)
C语言:指针运算笔试题解析(包括令人费解的指针题目)
|
1天前
HuggingFace Tranformers 源码解析(4)
HuggingFace Tranformers 源码解析
5 0

推荐镜像

更多