指针的基本应用

  1. #include <iostream>
  2. using namespace std;
  3. int sum(int* num1,int num2){
  4. *num1 = 20;//*是取值符,可以直接影响内存地址保存的值
  5. num2 = 30;
  6. return *num1 + num2;
  7. }
  8. int main()
  9. {
  10. int num1 = 1;
  11. int num2 = 2;
  12. int* pNum1 = &num1;//获取num的地址,并将pNum指针指向该地址,pNum1 == &mum1,
  13. cout << sum(pNum1, num2) << endl;
  14. cout << num1 << endl;//num1传参时用的是指针,修改的指定内存地址的内容,故而会对实参影响
  15. cout << num2 << endl;//num2传参时传的是值,不会影响实参,故而不变
  16. return 0;
  17. }

50 20 2

空指针及野指针

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int* p1 = (int*)0x1100;//野指针,指向其实我们并未申请内存的地方,如果访问会导致程序崩溃
  6. int *p2 = NULL;//空指针
  7. return 0;
  8. }

指针访问数组

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int arr[] = {1,2,3,4,5};
  6. int size = sizeof(arr)/sizeof(arr[0]);
  7. //一般访问数组的方式
  8. for (int i = 0; i < size; i++)
  9. {
  10. cout << arr[i] << endl;
  11. }
  12. //采用指针访问数组的方式
  13. int *p = arr;//指针会指向数组的第一个元素的地址
  14. for (int i = 0; i < size; i++)
  15. {
  16. cout << *p << endl;
  17. p++;//指针向后移,但一般不建议去移动指针,而是像数组一样利用索引访问,如下例
  18. }
  19. int* pArr = arr;
  20. for (int i = 0; i < 5; i++)
  21. {
  22. cout << pArr[i] << endl;
  23. }
  24. return 0;
  25. }

1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

如何把内存地址转为int类型

参考资料:https://ask.csdn.net/questions/7539281
因:64位下地址值是8字节,转为int会溢出,使用long long int承载即可

可能会编译失败的情况

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 10;
  6. cout << (int)&a << endl;
  7. }

可以修改为:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 10;
  6. cout << (long long int)&a << endl;
  7. }