指针那些事儿
来源:互联网 发布:网络文献参考文献格式 编辑:程序博客网 时间:2024/05/18 03:10
1.野指针(也叫悬摆指针,迷失指针)
野指针是导致BUG的罪魁祸首之一。对指针调用Delete后(释放掉了它指向的内存,野指针还是指向原来的地址),如果没有重新赋值就使用它,将导致难以预料的后果。因为此时操作野指针,它指向的内存地址可能已经分配给其他变量在使用了。
所以指针在Delete之后,如果不再使用,一定要赋值Nullptr。
2.const指针之一:指针本身是常量 or 指向的对象是常量
int iValOne = 111, iValTwo = 222, iValThree = 333;//示例1.指针指向的内容是常量const int *pValOne = &iValOne;//*pValOne = iValTwo; //错误,不能修改指针指向的内容:iValOne值不能被修改pValOne = &iValTwo; //正确,可以修改指针本身的地址:iValTwo的地址赋值给指针//示例2.指针本身是常量int * const pValTwo = &iValTwo;*pValTwo = iValThree; //正确,可以修改指针指向的内容:iValTwo的值修改为iValThree的值//pValTwo = &iValThree; //错误,不可以修改指针本身的地址:pValTwo的地址只能是iValTwo的地址//示例3.指针本身及其所指向的内容都是常量const int * const pValThree = &iValThree;//*pValThree = iValOne; //错误,不能修改指针指向的内容:iValThree值不能被修改//pValThree = &iValOne; //错误,不可以修改指针本身的地址:pValThree的地址只能是iValThree的地址常量指针,指针常量容易搞混淆,有一个比较好的办法,在星号(*)右边画一条竖线,
const在竖线左边:不能修改内容(内容为常量),如以上代码中示例1
const在竖线右边:不能修改指针本身(指针本身为常量),如以上代码中示例2
const在竖线两边:不能修改指针本身及其指向的内容,如以上代码中示例3
3.指针和数组
3.1指针和一维数组
int a[10];for (int i = 0; i < 10; i++){a[i] = i;}int *p = a;//同:int *p = &a[0];for (int i = 0; i < 10; i++){cout << *p << endl;p++;}
数组地址与指针
int a[10];for (int i = 0; i < 10; i++){a[i] = i;}int *p;p = &a[0];cout << *(a + 1) << endl;//输出1cout << *(p + 2) << endl;//输出2
3.2指针与二维数组
二维数组的内存地址是连续的,可以将二位数组看做一维数组。
int iArrayOfTwoDim[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//输出二维数组for (size_t i = 0; i < 3; i++){for (size_t j = 0; j < 4; j++){cout << setw(5)<< iArrayOfTwoDim[i][j];
<span style="white-space:pre"></span>//同:<span style="font-family: Arial, Helvetica, sans-serif;">cout << setw(5)<< </span><span style="font-family: Arial, Helvetica, sans-serif;">*(*(iArrayOfTwoDim + i) + j)</span><span style="font-family: Arial, Helvetica, sans-serif;">;</span>}cout << endl;}//转换为一维数组int iArrayOneDim[12];for (size_t i = 0; i < 3; i++){for (size_t j = 0; j < 4; j++){iArrayOneDim[i * 4 + j] = iArrayOfTwoDim[i][j];}}for (size_t i = 0; i < 12; i++){cout << setw(3) << iArrayOneDim[i] << endl;}
输出:
1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12请按任意键继续. . .二维数组通过指针访问地址输出,验证结果:二维数组在内存中是连续的
int iArrayOfTwoDim[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};int *pVal = iArrayOfTwoDim[0];//同:int *pVal = &iArrayOfTwoDim[0][0];//输出二维数组for (size_t i = 0; i < 3; i++){for (size_t j = 0; j < 4; j++){cout << "Value(Address " << pVal << "): " << *pVal++ << endl;}cout << endl;}
输出:
Value(Address 002EFBEC): 1Value(Address 002EFBF0): 2Value(Address 002EFBF4): 3Value(Address 002EFBF8): 4Value(Address 002EFBFC): 5Value(Address 002EFC00): 6Value(Address 002EFC04): 7Value(Address 002EFC08): 8Value(Address 002EFC0C): 9Value(Address 002EFC10): 10Value(Address 002EFC14): 11Value(Address 002EFC18): 12请按任意键继续. . .
4.指针与字符串
//连接两个字符串 char cArrayOne[50], cArrayTwo[50];cout << sizeof(cArrayOne) << endl;char *pStr1 = cArrayOne, *pStr2 = cArrayTwo;cout << sizeof(pStr1) << endl;cout << "Please input str1:";gets_s(cArrayOne);cout << "Please input pStr2:";gets_s(cArrayTwo);while (*pStr1 != '\0')pStr1++;while (*pStr2 != '\0')*pStr1++ = *pStr2++;*pStr1 = '\0';cout << "str1 + str2:";pStr1 = cArrayOne;//将pStr1重新指向cArrayOneputs(pStr1);//同:puts(cArrayOne);
输出:
504Please input str1:I amPlease input pStr2:fond of Cplusplus!str1 + str2:I am fond of Cplusplus!请按任意键继续. . .
Char*与Char[]的区别
char*指向常量时,内容不能修改;char[]可以修改;
char *pStr = "I love c++!";pStr[0] = 'U';//编译时没问题,运行时errorcout << pStr << endl;用char[]
char cArray[50] = "I love c++!";char *pStr = cArray;pStr[0] = 'U';//Okcout << pStr << endl;
0 0
- 指针那些事儿
- this指针的那些事儿
- 指针与二维数组的那些事儿
- 引用和指针的那些事儿
- 那些事儿
- 【产品那些事儿】产品经理那些事儿
- 西工大:那些人儿、那些事儿
- 明朝的那些事儿
- 明朝那些事儿
- '符号连接'那些事儿
- 《明朝那些事儿》读书笔记
- 去年那些事儿?
- Java编程那些事儿
- 广告匹配那些事儿
- Lighttpd那些事儿
- 依赖注入那些事儿
- Oracle 的那些事儿
- 安装MySQL那些事儿~~
- C#---字符串String
- 学习笔记3:Struts2+Spring JDBC+Spring
- 0018.scala文件的读取写入操作代码
- Parcel: unable to marshal value {CLASSNAME}
- 比较好的java学习网站
- 指针那些事儿
- C/C++中static关键字详解
- C语言的32个关键字、9种控制语句、34个运算符
- 常见的数字及浏览器版本修改
- 另类QQ客户端 直接用QQ号登陆 (借花献佛)
- 【Java 基础】--HttpServlet详解
- Linux--Advance getenv的非可重入版本
- NY2 括号匹配问题
- java获取html文档中的所有img标签