「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. }

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

相关文章
|
3月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
28天前
|
搜索推荐 C语言
指针与数组
指针与数组
49 9
|
1月前
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。
|
28天前
|
存储 程序员 C语言
指针的高级应用:指针数组、数组指针、函数指针等。
指针的高级应用:指针数组、数组指针、函数指针等。
60 0
|
2月前
|
运维
开发与运维数组问题之指针的加减法意义如何解决
开发与运维数组问题之指针的加减法意义如何解决
36 7
|
2月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
21 6
|
2月前
|
存储 C++ 运维
开发与运维数组问题之指针的定义语法如何解决
开发与运维数组问题之指针的定义语法如何解决
26 6
|
3月前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
3月前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
3月前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)