「2」指针进阶,最详细指针和数组难题解题思路

简介: 本篇文章,为了提高效率,也为了大家学起来更加方便,我是使用C++的处理方法,如果大家,还没有学习C++,也为大家提供C语言的版本<指针与数组>。其实我发现指针与数组的难题主要是,二维数组和指针的问题,如果大家理解起来有些困难,主要是大家没有弄懂二维数组的实质,建议大家可以看一下,大佬总结的二维数组超强解析,看完之后觉对这些题了如指掌!!

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

本篇文章,为了提高效率,也为了大家学起来更加方便,我是使用C++的处理方法,如果大家,还没有学习C++,也为大家提供C语言的版本<指针与数组>

其实我发现指针与数组的难题主要是,二维数组和指针的问题,如果大家理解起来有些困难,主要是大家没有弄懂二维数组的实质,建议大家可以看一下,

大佬总结的二维数组超强解析,看完之后觉对这些题了如指掌!!!

目录

🏡回顾

🐰一维数组

❤️‍🔥指针与整形型数组

❤️‍🔥指针与字符型数组

🐰二维数组


 

🏡回顾

数组-能够存放一组相同类型的元素。

指针-指针变量

数组是数组,指针就是指针的

数组名就是首元素地址

数组名大部分情况下就是首元素地址

sizaof(数组名),表示整个数组,计算的整个数组的大小

&数组名,取出的是整个数组的地址

🐰一维数组

❤️‍🔥指针与整形型数组

1. #include<iostream>
2. 
3. using namespace std;
4. 
5. int main()
6. 
7. {
8. 
9. int a[]={1,2,3,4};
10. 
11. cout<<sizeof(a)<<endl;//16
12. 
13. //sizaof(数组名),表示整个数组,计算的整个数组的大小
14. 
15. cout<<sizeof(a+0)<<endl;//4/8
16. 
17. //表示计算首元素地址的大小
18. 
19. cout<<sizeof(*a)<<endl;//4
20. 
21. //a还是首元素的地址,*a就是a[0]
22. 
23. cout<<sizeof(a+1)<<endl;//4/8
24. 
25. //表示计算第二个元素地址的大小
26. 
27. cout<<sizeof(a[1])<<endl;//4
28. 
29. cout<<sizeof(&a)<<endl;//4/8
30. 
31. //&a-整个数组的地址
32. 
33. //int (*p)[4]=&a;
34. 
35. cout<<sizeof(*&a)<<endl;//16
36. 
37. //相当于sizeof(a)
38. 
39. cout<<sizeof(&a+1)<<endl;//16
40. 
41. //&a+1跳过一个数组
42. 
43. //&a+1还是一个地址
44. 
45. cout<<sizeof(&a[0])<<endl;//4/8
46. 
47. cout<<sizeof(&a[0]+1)<<endl;//4/8
48. 
49. return 0;
50. 
51. }

❤️‍🔥指针与字符型数组

1. #include<iostream>
2. 
3. #include<string.h>
4. 
5. using namespace std;
6. 
7. int main()
8. 
9. {
10. 
11. char arr[]={'a','b','c','d','e','f'};
12. 
13. cout<<sizeof(arr)<<endl;//6
14. 
15. //sizeof计算的内存的大小,单位是字节,不关注内存里放的是什么
16. 
17. //sizeof是操作符
18. 
19. //strlen是函数,是针对字符串,求字符串的长度,本质计算\0之前的字符
20. 
21. cout<<sizeof(arr+0)<<endl;//4/8
22. 
23. //arr+0是首元素的地址
24. 
25. cout<<sizeof(*arr)<<endl;//1
26. 
27. //*arr是首元素,'a'
28. 
29. cout<<sizeof(arr[1])<<endl;
30. 
31. //计算第二个元素的大小
32. 
33. cout<<sizeof(&arr)<<endl;//4/8
34. 
35. //整个数组的地址
36. 
37. cout<<sizeof(&arr+1)<<endl;//4/8
38. 
39. //跳过一个数组的地址
40. 
41. cout<<sizeof(&arr[0]+1)<<endl;//4/8
42. 
43. //第二个元素的地址
44. 
45. cout<<strlen(arr)<<endl;//随机值,不知道亲\0的位置
46. 
47. cout<<strlen(arr+0)<<endl;//随机值,不知道亲\0的位置
48. 
49. //cout<<strlen(*arr)<<endl;//错误
50. 
51. //strlen的原型为size_t strlen ( const char * str );,应该传入地址
52. 
53. //cout<<strlen(arr[1])<<endl;//错误,和上面的错误原因相同
54. 
55. //cout<<strlen(&arr)<<endl;//随机值
56. 
57. cout<<strlen(&arr+1)<<endl;//随机值
58. 
59. cout<<strlen(&arr[0]+1)<<endl;//随机值
60. 
61. return 0;
62. 
63. }
1. #include<iostream>
2. 
3. #include<string.h>
4. 
5. using namespace std;
6. 
7. int main()
8. 
9. {
10. 
11. char arr[]="abcdef";
12. 
13. cout<<sizeof(arr)<<endl;//7
14. 
15. //里面还有一个‘\0’
16. 
17. cout<<sizeof(arr+0)<<endl;//4/8
18. 
19. //arr+0是首元素的地址
20. 
21. cout<<sizeof(*arr)<<endl;//1
22. 
23. //*arr是首元素,'a'
24. 
25. cout<<sizeof(arr[1])<<endl;//1
26. 
27. //计算第二个元素的大小
28. 
29. cout<<sizeof(&arr)<<endl;//4/8
30. 
31. //整个数组的地址
32. 
33. cout<<sizeof(&arr+1)<<endl;//4/8
34. 
35. //跳过一个数组的地址
36. 
37. cout<<sizeof(&arr[0]+1)<<endl;//4/8
38. 
39. //第二个元素的地址
40. 
41. cout<<strlen(arr)<<endl;//6
42. 
43. //不计算'\0'
44. 
45. cout<<strlen(arr+0)<<endl;//6
46. 
47. //cout<<strlen(*arr)<<endl;//错误
48. 
49. //strlen的原型为size_t strlen ( const char * str );,应该传入地址
50. 
51. //cout<<strlen(arr[1])<<endl;//错误,和上面的错误原因相同
52. 
53. //cout<<strlen(&arr)<<endl;//6
54. 
55. //cout<<strlen(&arr+1)<<endl;//随机值
56. 
57. cout<<strlen(&arr[0]+1)<<endl;//5 
58. 
59. return 0;
60. 
61. }
1. #include<iostream>
2. 
3. #include<string.h>
4. 
5. using namespace std;
6. 
7. int main()
8. 
9. {
10. 
11. char* p="abcdef";
12. 
13. cout<<sizeof(p)<<endl;//4/8
14. 
15. cout<<sizeof(p+1)<<endl;//4/8
16. 
17. //第二个元素的地址
18. 
19. cout<<sizeof(*p)<<endl;//1
20. 
21. cout<<sizeof(p[0])<<endl;//1
22. 
23. cout<<sizeof(&p)<<endl;//4/8
24. 
25. cout<<sizeof(&p+1)<<endl;//4/8
26. 
27. cout<<sizeof(&p[0])<<endl;//4/8
28. 
29. cout<<sizeof(&p[0]+1)<<endl;//4/8
30. 
31. //第二个元素的地址
32. 
33. cout<<strlen(p)<<endl;//6
34. 
35. cout<<strlen(p+1)<<endl;//5
36. 
37. //cout<<strlen(*p)<<endl;//错误
38. 
39. //cout<<strlen(p[0])<<endl;//错误
40. 
41. //cout<<strlen(&p)<<endl;//随机值
42. 
43. //cout<<strlen(&p+1)<<endl;//随机值
44. 
45. //strlen(&p)和strlen(&p+1)没有关系
46. 
47. cout<<strlen(&p[0]+1)<<endl;//5
48. 
49. return 0;
50. 
51. }

🐰二维数组

1. #include<iostream>
2. 
3. using namespace std;
4. 
5. int main()
6. 
7. {
8. 
9. int a[3][4]={0};
10. 
11. cout<<sizeof(a)<<endl;//48
12. 
13. //二维数组的数组命名单独放在sizeof内部,算的是整个数组的大小
14. 
15. cout<<sizeof(a[0][0])<<endl;//4
16. 
17. cout<<sizeof(a[0])<<endl;//16
18. 
19. //第一行的数组名,计算的数组的大小
20. 
21. cout<<sizeof(a[0]+1)<<endl;//4/8
22. 
23. //第一行的第二个元素的地址 &a[0][0]+1
24. 
25. cout<<sizeof(*(a[0]+1))<<endl;//4
26. 
27. //第一行的第二个元素 *(&a[0][0]+1)=a[0][1]
28. 
29. cout<<sizeof(a+1)<<endl;//8
30. 
31. //a=&a[0]
32. 
33. //a[i]=&a[i][0]
34. 
35. //a+1就是第二行的地址 &a[0]+1=&a[1]
36. 
37. cout<<sizeof(*(a+1))<<endl;//16
38. 
39. //*(&a[0]+1)=*(&a[1])=a[1]
40. 
41. cout<<sizeof(&a[0]+1)<<endl;//4/8
42. 
43. cout<<sizeof(*(&a[0]+1))<<endl;//16
44. 
45. //a[1]拿到第二行的元素
46. 
47. cout<<sizeof(*a)<<endl;//16
48. //*a=a[1],a[1]是第二行的首元素,sizeof(a[1])算的是第二行整个的大小
49. 
50. cout<<sizeof(*a+1)<<endl;//4/8
51. 
52. //a[0]+1
53. 
54. //&a[0][0]+1=&a[0][1]
55. 
56. cout<<sizeof(a[3])<<endl;//16
57. //计算的类型的大小,sizeof是在预处理的时候,就完成计算了,所以在编译的时候,不会计算,预处理的时候,计算a[3]就相当于计算a[i]的类型大小
58. 
59. return 0;
60. 
61. }

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸

相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
37 3
|
24天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
28天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
28天前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
28天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
53 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
48 2
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
39 1
|
2月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
2月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。