当前位置:   article > 正文

【学习笔记】C++指针&指针的移动,和数组关系,多重指针&多重指针数组_c++指针类型 移动

c++指针类型 移动

目录

1.定义指针

2.特殊指针

3.const 修饰指针

4.指针访问数组

5.指针与函数结合实例

6.指针的移动,和数组关系

7.多重指针&多重指针数组



1.定义指针

语法

1.数据类型 * 指针名称 =&变量;

2.指针名称 =&变量;

*p代表的就是指针地址所指向的变量

指针的地址:&p

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. int a = 100;
  7. int b =300;
  8. cout << a << endl;
  9. int *p = &a; //初始化指针
  10. cout <<"a="<< a << endl;
  11. cout << "p=" << p << endl;
  12. cout << "*p=" << *p << endl;
  13. p = &a;
  14. cout << "p=" << p << endl;
  15. cout << "*p=" << *p << endl;
  16. *p=200;
  17. cout <<"a="<< a << endl;
  18. cout <<"&*p="<< &*p << endl;//变量a的地址
  19. cout <<"&p="<< &p << endl;//指针的地址
  20. system("pause");
  21. return 0;
  22. }

2.特殊指针

空指针:int *p =NULL;

野指针:为被声明的内存地址,不可访问。

3.const 修饰指针

常量指针:const int *p =&a;

指针指向的对象可以更改

指针指向的不可更改

指针常量 int * const p =&a;

指针指向的对象不可以更改

指针指向的可更改

4.指针访问数组

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. int arr0[] = {1, 2, 3, 4, 5};
  7. double arr1[] = {1.1, 2.1, 3.1, 4.1, 5.1};
  8. int *p = arr0; //数组名就是第一个元素的地址,不用&
  9. double *p2 = arr1;
  10. cout << "*p=" << *p << " arr0[0]=" << arr0[0] << endl;
  11. p++;//移位4字节
  12. cout << "*p=" << *p << " arr0[1]=" << arr0[1] << endl;
  13. cout << "*p2=" << *p2 << " arr1[0]=" << arr1[0] << endl;
  14. p2++; //指针移位会按照不同类型进行移位 移位8字节
  15. cout << "*p2=" << *p2 << " arr1[1]=" << arr1[1] << endl;
  16. //不同指针的类型占用空间一样
  17. cout << "sizeof p=" << sizeof(p) << endl;
  18. cout << "sizeof p2=" << sizeof(p2) << endl;
  19. cout << "sizeof *p=" << sizeof(*p) << endl;
  20. cout << "sizeof *p2=" << sizeof(*p2) << endl;
  21. cout << "arrdess of=arr1[0]" << arr1 << endl;
  22. cout << "arrdess of=arr1[1]" << &arr1[1] << endl;
  23. cout << "value of p2" << p2 << endl;
  24. system("pause");
  25. return 0;
  26. }

5.指针与函数结合实例

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. void bubbleSort(int *p, int arr_length);
  5. int main()
  6. {
  7. int arr0[] = {10, 6, 7, 4, 5, 6, 8, 7, 6, 45, 52, 4}; //函数传递数组的实质其实就是指针
  8. bubbleSort(arr0, sizeof(arr0) / sizeof(arr0[1]));
  9. system("pause");
  10. return 0;
  11. }
  12. void bubbleSort(int *p, int arr_length) //int *p 和 int p[] 等价
  13. {
  14. for (int i = 0; i < arr_length - 1; i++)
  15. {
  16. for (int j = 0; j < arr_length - i - 1; j++)
  17. {
  18. if (p[j] > p[j + 1])
  19. {
  20. int temp = p[j];
  21. p[j] = p[j + 1];
  22. p[j + 1] = temp;
  23. }
  24. }
  25. /* code */
  26. }
  27. for (int i = 0; i < arr_length; i++)
  28. {
  29. cout << p[i] << " ,";
  30. }
  31. cout << endl;
  32. }

6.指针的移动,和数组关系

指针与数组的关系,C语言指针和数组的关系详解

数组和指针的关系(区别)详解

C语言数组指针(指向数组的指针)

  1. int arr[] = { 99, 15, 100, 888, 252 };
  2. int *p = arr;

arr 本身就是一个指针(严格来说应该是“arr 被转换成了一个指针”,可以直接赋值给指针变量 p。arr 是数组第 0 个元素的地址,所以int *p = arr;也可以写作int *p = &arr[0];。也就是说,arr、p、&arr[0] 这三种写法都是等价的,它们都指向数组第 0 个元素,或者说指向数组的开头。如果一个指针指向了数组,我们就称它为数组指针(Array Pointer)。

数组在内存中只是数组元素的简单排列,没有开始和结束标志,在求数组的长度时不能使用sizeof(p) / sizeof(int),因为 p 只是一个指向 int 类型的指针,编译器并不知道它指向的到底是一个整数还是一系列整数(数组),所以 sizeof(p) 求得的是 p 这个指针变量本身所占用的字节数,而不是整个数组占用的字节数。

也就是说,根据数组指针不能逆推出整个数组元素的个数,以及数组从哪里开始、到哪里结束等信息。不像字符串,数组本身也没有特定的结束标志,如果不知道数组的长度,那么就无法遍历整个数组。

在 C++ 中,当给一个指针添加一个值的时候,实际上添加的值是把这个值乘以指针引用的数据类型的大小。换句话说,如果给 numbers 加 1,实际上就是给 numbers 加上 1Xsizeof(short);如果给 numbers 加 2,实际上就是给 numbers + 2Xsizeof(short),以此类推。在 PC 上,这意味着以下说法是真实的,因为 short(短整数)通常使用 2 个字节:

  • *(numbers +1)是指地址 numbers + 1X2 处的值。
  • *(numbers + 2)是指地址 numbers + 2X2 处的值。
  • *(numbers + 3)是指地址numbers + 3X2 处的值。

以此类推。

假设 p 是指向数组 arr 中第 n 个元素的指针,那么 *p++、*++p、(*p)++ 分别是什么意思呢?

*p++ 等价于 *(p++),表示先取得第 n 个元素的值,再将 p 指向下一个元素,上面已经进行了详细讲解。

*++p 等价于 *(++p),会先进行 ++p 运算,使得 p 的值增加,指向下一个元素,整体上相当于 *(p+1),所以会获得第 n+1 个数组元素的值。

(*p)++ 就非常简单了,会先取得第 n 个元素的值,再对该元素的值加 1。假设 p 指向第 0  个元素,并且第 0 个元素的值为 99,执行完该语句后,第 0  个元素的值就会变为 100。

7.多重指针&多重指针数组

多重指针

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. int a[5]={0,1,2,3,4};
  5. int *arr=a;
  6. int **p_arr;
  7. p_arr = &arr;
  8. cout<<sizeof(p_arr)<<endl;
  9. cout<<sizeof(arr)<<endl;
  10. cout<<p_arr<<endl;//变量保存arr地址
  11. cout<<&arr<<endl<<endl;
  12. cout<<*p_arr<<endl;//数组a的首地址
  13. cout<<arr<<endl;
  14. cout<<a<<endl<<endl;
  15. cout<<p_arr[1]<<endl;//arr[1]的地址
  16. cout<<&a[1]<<endl<<endl;//数组a【1】的地址
  17. cout<<p_arr[0]<<endl;
  18. cout<<&arr[0]<<endl;
  19. cout<<&arr[1]<<endl<<endl;
  20. cout<<*p_arr[0]<<endl;
  21. cout<<arr[0]<<endl;
  22. cout<<arr[1]<<endl;
  23. system("pause");
  24. return 0;
  25. }

多重指针数组

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a[5] = {0, 1, 2, 3, 4};
  6. int *arr[2] = {&a[0], &a[1]};
  7. int **p_arr;
  8. p_arr = arr;
  9. cout << sizeof(p_arr) << endl;
  10. cout << sizeof(arr) << endl; //arr为int型数组
  11. cout<<"arr数组的首地址"<<endl;
  12. cout << p_arr << endl; //arr数组的首地址
  13. cout << &arr[0] << endl;
  14. cout << &arr << endl
  15. << endl;
  16. cout<<"数组a的首地址"<<endl;
  17. cout << *p_arr << endl;//数组a的首地址
  18. cout << arr[0] << endl;
  19. cout << a << endl
  20. << endl;
  21. cout<<"数组arr[1]的地址"<<endl;
  22. cout << &p_arr[1] << endl;
  23. cout << &arr[1] << endl
  24. << endl;
  25. cout<<"数组a[1]的地址"<<endl;
  26. cout<<p_arr[1]<<endl;
  27. cout<<arr[1]<<endl;
  28. cout<<&a[1]<<endl<<endl;
  29. cout<<"数组a[0]的值"<<endl;
  30. cout << *p_arr[0] << endl;
  31. cout << *arr[0] << endl;
  32. cout << a[0] << endl;
  33. system("pause");
  34. return 0;
  35. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/223613
推荐阅读
相关标签
  

闽ICP备14008679号