C++学习——第7章 指针(上)
2012-12-05 20:20
253 查看
1. 概念
指针:一个可用于存储内存地址的变量。
指针不仅仅是“指针”,还表示了数据项的类型。
声明:
long* pnumber; 或者 long * pnumber; 再或者 long*pumber;
用第一个,对类型“指向long”的表达更清晰一些。但是,在同一个语句中混合使用一般的变量和指针的声明时,可能会产生混淆。如:
long* pnumber, number;
所以,一般写成:long *pnumber, number; //声明一个指针,和一个long变量。
2. 使用指针
A. 地址运算符
地址运算符 &,是一个一元运算符,他可以获取存储变量的内存地址。
如:long number = 12345l;
long* pnumber;
因为变量number的类型和指针pnumber的类型是兼容的,所以可以进行如下赋值:
pnumber =&number;
也就是说,把number的地址赋予了pumber。
可以使用&运算符获取任何类型的变量地址。但必须在对应类型的指针中存储该地址。
如:如果要存储double变量的地址,指针必须声明为类型double*,即“指向double”。如果在类型错误的指针中存储了地址,程序就不会编译。
B. 间接运算符
间接运算符 *,它和指针变量一起使用,访问指针所指向的内存位置的内容。(访问指针所指向的内存位置的数据的过程称为“解除指针的引用”)
要访问指针pnumber指向的地址中的数据,可以使用表达式*pnumber。下面看代码:
C. 为什么使用指针?
①.可以使用指针记号操作存储在数组中的数据,这常常比使用数组表示法快一些。
②.定义自己的函数时,可以在函数中访问在该函数外部定义的大块数据。
③.可以动态地为新变量分配内存空间。
3. 指针的初始化
使用未初始化的指针甚至比使用未初始化的一般变量和数组更危险。如果指针变量包含个垃圾值,就可能覆盖内存的某个随机区域。因为造成的伤害仅取决于运气,所以一定要使指针初始化。
int number = 0;
int* pnumber = &number;
用另一个变量初始化指针时,必须在声明指针之前声明变量。否则,编译器就会产生错误。
当然也可以不用指定变量的地址来初始化指针。
int* pnumber = 0;
把指针初始化为char类型:
char* pproverb = “A miss is as good asmile. ”;
这个语句看起来非常类似于用字符串字面量出事话char数组,但是它们是完全不同的。这个语句利用引号中的字符串创建了一个非空字符串(实际上是const char类型的数组),并把字符串字面量中第一个字符的地址村春在指针pproverb中。
问题出现了,字符串字面量的类型是const,但指针的类型不是const。如果编写一些代码来修改该字符串:
编译器会编译,找不出错误,因为指针不是const类型。但是程序运行后会产生错误,因为字符串字面量仍是一个常量,不能修改。
为什么编译器允许给非const类型赋予const值,但运行代码会产生错误。原因是字符串字面量仅在C++标准下是常量,而且有许多以前的代码依赖于“不正确的”赋值。
所以正确的用法:
这样其类型就与字符串字面量的类型一致了。
幸运之星:
指针数组:
指针:一个可用于存储内存地址的变量。
指针不仅仅是“指针”,还表示了数据项的类型。
声明:
long* pnumber; 或者 long * pnumber; 再或者 long*pumber;
用第一个,对类型“指向long”的表达更清晰一些。但是,在同一个语句中混合使用一般的变量和指针的声明时,可能会产生混淆。如:
long* pnumber, number;
所以,一般写成:long *pnumber, number; //声明一个指针,和一个long变量。
2. 使用指针
A. 地址运算符
地址运算符 &,是一个一元运算符,他可以获取存储变量的内存地址。
如:long number = 12345l;
long* pnumber;
因为变量number的类型和指针pnumber的类型是兼容的,所以可以进行如下赋值:
pnumber =&number;
也就是说,把number的地址赋予了pumber。
可以使用&运算符获取任何类型的变量地址。但必须在对应类型的指针中存储该地址。
如:如果要存储double变量的地址,指针必须声明为类型double*,即“指向double”。如果在类型错误的指针中存储了地址,程序就不会编译。
B. 间接运算符
间接运算符 *,它和指针变量一起使用,访问指针所指向的内存位置的内容。(访问指针所指向的内存位置的数据的过程称为“解除指针的引用”)
要访问指针pnumber指向的地址中的数据,可以使用表达式*pnumber。下面看代码:
#include <iostream> using namespace std; int main() { long number = 50L; long *pnumber; pnumber = &number; cout << endl << "The value stored in the variable number is " << *pnumber << endl; return 0; }
C. 为什么使用指针?
①.可以使用指针记号操作存储在数组中的数据,这常常比使用数组表示法快一些。
②.定义自己的函数时,可以在函数中访问在该函数外部定义的大块数据。
③.可以动态地为新变量分配内存空间。
3. 指针的初始化
使用未初始化的指针甚至比使用未初始化的一般变量和数组更危险。如果指针变量包含个垃圾值,就可能覆盖内存的某个随机区域。因为造成的伤害仅取决于运气,所以一定要使指针初始化。
int number = 0;
int* pnumber = &number;
用另一个变量初始化指针时,必须在声明指针之前声明变量。否则,编译器就会产生错误。
当然也可以不用指定变量的地址来初始化指针。
int* pnumber = 0;
把指针初始化为char类型:
char* pproverb = “A miss is as good asmile. ”;
这个语句看起来非常类似于用字符串字面量出事话char数组,但是它们是完全不同的。这个语句利用引号中的字符串创建了一个非空字符串(实际上是const char类型的数组),并把字符串字面量中第一个字符的地址村春在指针pproverb中。
问题出现了,字符串字面量的类型是const,但指针的类型不是const。如果编写一些代码来修改该字符串:
*pproverb = ‘x’; |
为什么编译器允许给非const类型赋予const值,但运行代码会产生错误。原因是字符串字面量仅在C++标准下是常量,而且有许多以前的代码依赖于“不正确的”赋值。
所以正确的用法:
const char* pproverb = “A miss is as good as a mile. ”; |
幸运之星:
#include <iostream> using namespace std; int main() { const char* pstar1 = "Mae West"; const char* pstar2 = "Arnold Schwarzenegger"; const char* pstar3 = "Lassie"; const char* pstar4 = "Slim Pickens"; const char* pstar5 = "Greta Garbo"; const char* pstar6 = "Oliver Hardy"; const char* pstr = "Your lucky star is "; int choice = 0; cout << endl << "Pick a luck star!" << "Enter a number between 1 and 6: " << endl; cin >> choice; cout << endl; //数组被6个指针(pstar1到pstar6)代替了。 switch(choice) { case 1: cout << pstr << pstar1; break; case 2: cout << pstr << pstar2; break; case 3: cout << pstr << pstar3; break; case 4: cout << pstr << pstar4; break; case 5: cout << pstr << pstar5; break; case 6: cout << pstr << pstar6; break; default: //输入不正确的值的情况。 cout << "Sorry,you haven't got a lucky star."; } cout << endl; return 0; }
指针数组:
#include <iostream> using namespace std; int main() { const char* pstars[] = { "Mae west", "Arnold Schwarzenegger", "Lassie", "Slim Pickens", "Greta Garbo", "Oliver Hardy" }; const char* pstr = "Your lucky star is "; int choice = 0; const int starCount = sizeof pstars/sizeof pstars[0]; //求得数组长度 cout << endl << "Pick a lucky star!" << " Enter a number between 1 and " << starCount << ": "; cin >> choice; cout << endl; if (choice >= 1 && choice <= starCount) //大于零且小于数组长度 cout << pstr << pstars[choice-1]; else cout << "Sorry, you haven't got a lucky star. "; //输入错误,则没有幸运星 cout << endl; return 0; }
相关文章推荐
- C++学习——第7章 指针(下)
- [c++学习] C++ primer 第4版 习题4.20 4.21 常量指针 和 指针常量
- 智能指针auto_prt的使用(c++学习笔记)
- C++指针问题与学习
- C++指针学习
- C++学习--指针
- 【C/C++语言基础学习】在主函数的定义的指针数组、二维数组通过三级指针在被调用函数分配内存
- C++学习笔记 c++引用(&)与指针(*)的区别
- 【C/C++学习】之十六、关于空指针NULL、野指针、通用指针
- C++引用数组,函数指针,函数指针数组,结构体数组等学习
- C++学习:指针
- C++学习之函数和指针
- 我的 C++ 学习历程 之五 指针与引用
- C++学习——数组、指针与引用
- 【C++学习】——指针运算
- C++学习笔记三之指针
- c++学习笔记1(指针和引用)
- C++学习笔记六之函数如何使用指针来处理数组?
- 【C++】【学习笔记】【016】this指针和类的继承
- c++ 11学习笔记--智能指针