简介:
指针可以简化c++编程,在一些任务中没有指针是无法完成的(动态内存分配)
使用 & 可以获得变量在内存中的地址:
eg:
1 #include <iostream>
2
3 using namespace std;
4
5 int main ()
6 {
7 int var1;
8 char var2[10];
9
10 cout << "var1 变量的地址: ";
11 cout << &var1 << endl;
12
13 cout << "var2 变量的地址: ";
14 cout << &var2 << endl;
15
16 return 0;
17 }
View Code
定义:
指针:是一个变量,它的值是另一个变量的地址。在使用前要对它进行声明和赋值。
空指针:
NULL:为空指针,如果没有确切的地址可以赋值,为指针赋值一个null是一个好的习惯。
eg:
1 #include <iostream>
2
3 using namespace std;
4
5 int main ()
6 {
7 int *ptr = NULL;
8
9 cout << "ptr 的值是 " << ptr ;
10
11 return 0;
12 }
View Code
执行结果是:ptr 的值是 0
大多数操作系统中程序是不允许访问地址为0的内存。该内存视为操作系统保留的,他可以表明指针不指向一个可以访问的内存,所以如果指针包含空值就假定它不指向任何东西。
对于空指针的的检查:
if (ptr) 或if (!ptr) 未初始化的变量存在垃圾直,会使程序的调试难以进行。
指针的运算:
指针可以进行 ++、 +、 -、 -- 运算。
如果ptr是指向1000的整形指针,ptr++是指向1004位置的指针。每增加一次往后移动4个字节,如果是字符型指针,ptr++指向1001,往后移动一个字节。
通常使用++、 -- 是在使用指针代替数组的时候使用。
eg:
1 #include <iostream>
2
3 using namespace std;
4 const int MAX = 3;
5
6 int main ()
7 {
8 int var[MAX] = {10, 100, 200};
9 int *ptr;
10
11 // 指针中的数组地址
12 ptr = var;
13 for (int i = 0; i < MAX; i++)
14 {
15 cout << "Address of var[" << i << "] = ";
16 cout << ptr << endl;
17
18 cout << "Value of var[" << i << "] = ";
19 cout << *ptr << endl;
20
21 // 移动到下一个位置
22 ptr++;
23 }
24 return 0;
25 }
View Code
编译结果:
Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200
指针的比较:
指针可以使用关系运算符进行比较:== 、<、>
eg:
1 #include <iostream>
2
3 using namespace std;
4 const int MAX = 3;
5
6 int main ()
7 {
8 int var[MAX] = {10, 100, 200};
9 int *ptr;
10
11 // 指针中第一个元素的地址
12 ptr = var;
13 int i = 0;
14 while ( ptr <= &var[MAX - 1] )
15 {
16 cout << "Address of var[" << i << "] = ";
17 cout << ptr << endl;
18
19 cout << "Value of var[" << i << "] = ";
20 cout << *ptr << endl;
21
22 // 指向上一个位置
23 ptr++;
24 i++;
25 }
26 return 0;
27 }
View Code
运行结果:
Address of var[0] = 0xbfce42d0
Value of var[0] = 10
Address of var[1] = 0xbfce42d4
Value of var[1] = 100
Address of var[2] = 0xbfce42d8
Value of var[2] = 200
指向指针的指针:
指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。通常,一个指针包含一个变量的地址。当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置。
声明: int **var;
当一个目标值被一个指针间接指向到另一个指针时,访问这个值需要使用两个星号运算符
1 #include <iostream>
2
3 using namespace std;
4
5 int main ()
6 {
7 int var;
8 int *ptr;
9 int **pptr;
10
11 var = 3000;
12
13 // 获取 var 的地址
14 ptr = &var;
15
16 // 使用运算符 & 获取 ptr 的地址
17 pptr = &ptr;
18
19 // 使用 pptr 获取值
20 cout << "var 值为 :" << var << endl;
21 cout << "*ptr 值为:" << *ptr << endl;
22 cout << "**pptr 值为:" << **pptr << endl;
23
24 return 0;
25 }
View Code
结果:
var 值为 :3000
*ptr 值为:3000
**pptr 值为:3000
C++ 传递指针给函数
eg:
1 #include <iostream>
2 #include <ctime>
3
4 using namespace std;
5 void getSeconds(unsigned long *par);
6
7 int main ()
8 {
9 unsigned long sec;
10
11
12 getSeconds( &sec );
13
14 // 输出实际值
15 cout << "Number of seconds :" << sec << endl;
16
17 return 0;
18 }
19
20 void getSeconds(unsigned long *par)
21 {
22 // 获取当前的秒数
23 *par = time( NULL );
24 return;
25 }
View Code
结果
Number of seconds :1294450468
数组作为参数:
1 #include <iostream>
2 using namespace std;
3
4 // 函数声明
5 double getAverage(int *arr, int size);
6
7 int main ()
8 {
9 // 带有 5 个元素的整型数组
10 int balance[5] = {1000, 2, 3, 17, 50};
11 double avg;
12
13 // 传递一个指向数组的指针作为参数
14 avg = getAverage( balance, 5 ) ;
15
16 // 输出返回值
17 cout << "Average value is: " << avg << endl;
18
19 return 0;
20 }
21
22 double getAverage(int *arr, int size)
23 {
24 int i, sum = 0;
25 double avg;
26
27 for (i = 0; i < size; ++i)
28 {
29 sum += arr[i];
30 }
31
32 avg = double(sum) / size;
33
34 return avg;
35 }
View Code
结果
Average value is: 214.4
C++ 从函数返回指针
函数声明:
int * myFunction()
{
.
.
.
}
另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。
eg:
1 #include <iostream>
2 #include <ctime>
3 #include <cstdlib>
4
5 using namespace std;
6
7 // 要生成和返回随机数的函数
8 int * getRandom( )
9 {
10 static int r[10];
11
12 // 设置种子
13 srand( (unsigned)time( NULL ) );
14 for (int i = 0; i < 10; ++i)
15 {
16 r[i] = rand();
17 cout << r[i] << endl;
18 }
19
20 return r;
21 }
22
23 // 要调用上面定义函数的主函数
24 int main ()
25 {
26 // 一个指向整数的指针
27 int *p;
28
29 p = getRandom();
30 for ( int i = 0; i < 10; i++ )
31 {
32 cout << "*(p + " << i << ") : ";
33 cout << *(p + i) << endl;
34 }
35
36 return 0;
37 }
38 当上面的代码被编译和执行时,它会产生下列结果:
39
40 624723190
41 1468735695
42 807113585
43 976495677
44 613357504
45 1377296355
46 1530315259
47 1778906708
48 1820354158
49 667126415
50 *(p + 0) : 624723190
51 *(p + 1) : 1468735695
52 *(p + 2) : 807113585
53 *(p + 3) : 976495677
54 *(p + 4) : 613357504
55 *(p + 5) : 1377296355
56 *(p + 6) : 1530315259
57 *(p + 7) : 1778906708
58 *(p + 8) : 1820354158
59 *(p + 9) : 667126415
View Code
函数指针:
文档:函数指针
链接:
文档:10 数组指针和指针数组的区别链接:http://note.youdao.com/noteshare?id=666741e0f5df0ba7beb2a97eeff1fdce&sub=wcp1565830202948624
身体是1,财富·名利·是0,没有1有再多的0都没有用!!