C++学习系列笔记(二)

举报
小小谢先生 发表于 2022/04/16 00:36:45 2022/04/16
【摘要】 10、指针 指针是一种指向内存单元的特殊变量。声明指针如下:int *pInteger = NULL; #初始化指针 使用引用运算符(&)获取变量的地址 可以声明一个int指针来储存变量的地址:int* pInteger = &age **可将不同的内存地址赋给同一个指针变量,让它指向不同的值,如下个程序: #incl...

10、指针
指针是一种指向内存单元的特殊变量。声明指针如下:
int *pInteger = NULL; #初始化指针
使用引用运算符(&)获取变量的地址
可以声明一个int指针来储存变量的地址:
int* pInteger = &age
**可将不同的内存地址赋给同一个指针变量,让它指向不同的值,如下个程序:


  
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int age = 30;
  6. int* pInteger = &age;
  7. cout << "pInteger points to Age now" << endl;
  8. cout << "pInteger=0x" << hex << pInteger << endl;
  9. int dogsage = 9;
  10. pInteger = &dogsage;
  11. cout << "pInteger dogsage=0x" << hex << pInteger << endl;
  12. return 0;
  13. }

使用解除引用运算符(星号)访问指向的数据,如:
*pInteger #访问数据
将sizeof()用于指针时,结果与指针指向的变量类型无关,而是取决于使用的编译器和针对的操作系统。
动态内存分配
使用new来动态的分配新的内存块。如果成功,new将返回指向一个指针,指向分配的内存;需要指定要为哪种数据类型分配内存。
Type* Pointer = new Type; #Type为类型
还可以指定为多少个元素分配内存
Type* Pointer = new Type[NumElements]
例如:int* Pointer = new int[10];
使用new分配的内存最终都需要使用对应的delete进行释放
delete Pointer;
delete[] Pointer
PS: delete只能释放new创建的内存,而不是用于包含任何地址的内存。
将指针递增或递减时,其包含的地址将增加或减少指向的数据类型的sizeof(并不一定是1字节)。这样,编译器将确保指针不会指向数据的中间或末尾,而只会指向数据的开头。如下:
Type* pType = Address;
则执行++PType后,PType将包含指向Address+sizeof(Type)
示例代码如下:


  
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout << "how many integers you wish to enter?";
  6. int InputNums = 0;
  7. cin >> InputNums;
  8. int*pNumbers = new int[InputNums];
  9. int*pCopy = pNumbers; //保存了该地址的拷贝
  10. cout << "sucessfully allocated memory for" << InputNums << "integers" << endl;
  11. for (int Index = 0; Index < InputNums; ++Index)
  12. {
  13. cout << "enter number" << Index << ":";
  14. cin >> *(pNumbers + Index);
  15. }
  16. cout << "displaying all numbers input:" << endl;
  17. for (int Index = 0, int* pCopy = pNumbers; Index < InputNums; ++Index)
  18. {
  19. cout << *(pCopy++) << ":" << endl;
  20. }
  21. delete[] pNumbers;
  22. return 0;
  23. }

将关键字const用于指针
const指针有如下三种:
①指针指向的数据为常量,不能修改,但可以修改指针的地址,即指针可以指向其它地方


  
  1. int HoursInDay = 24;
  2. const int* pInteger = & HoursInDay

②指针包含的地址是常量,不能修改,但可以修改指针指向的数据


  
  1. int HoursInDay =24;
  2. int* const pInteger = & HoursInDay

③指针包含的地址及它指向的值都是常量,不能修改


  
  1. int HoursInDay = 24;
  2. const int* const pInteger = & HoursInDay

务必初始化指针变量,如果不能将指针初始化为new返回的有效地址或它有效变量,可将其初始化为NULL。
检查使用new发出的分配请求是否得到满足
C++提供了两种确保指针有效的方法,默认方法是使用异常,即如果内存分配失败,将引发std::bad_alloc异常。这将导致应用程序中断执行。异常处理有以下两种方法:


  
  1. //第一种
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. try
  7. {
  8. int* pAge = new int[5368709111];
  9. delete[] pAge;
  10. }
  11. catch (bad_alloc)
  12. {
  13. cout << "memory failed.ending program" << endl;
  14. }
  15. return 0;
  16. }

  
  1. //第二种
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. int* pAge = new(nothrow) int[0x1fffffff];
  7. if (pAge)
  8. {
  9. delete[] pAge;
  10. }
  11. else
  12. cout << "memory allocation failed" << endl;
  13. return 0;
  14. }

文章来源: blog.csdn.net,作者:小小谢先生,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xiewenrui1996/article/details/90489043

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。