1 // 16-指针.cpp: 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include <iostream>
6 #include <climits>
7
8 using namespace std;
9
10 int main()
11 {
12
13 int a = 10; //定义变量后,系统默认会给变量分配一个地址。
14 float b = 9.7f; //将double数据存储在float类型中有可能会遇到数据太大存不下报错。写成9.7f。
15 int c = 20;
16 //怎么取得变量的内存地址呢?
17 //&取得一个变量的内存地址
18 cout << &a << endl; //取得a变量的内存地址。
19 cout << &b << endl;
20 //*从内存地址所对应的内存处取得数据。
21 cout << *(&a) << endl;
22
23 //取地址的时候用&加上变量,取数据时用*加上地址。
24 //对于一个变量(数据)来说在内存中有两个东西,一个是它的内存地址,一个是它的值。
25
26 //指针用来存地址的,分不同的类型,因为不同类型所占的内存空间不同。
27 int* pa = &a;//定义一个int类型的指针,并存储a的地址。
28 float* pb = &b;//定义一个float类型的指针,并存储b的地址。
29 cout << pa << endl;
30 cout << pb << endl;
31
32 //通过指针访问数据。
33 cout <<*pa << endl;
34 cout <<*pa << endl;
35
36 int* p;
37 p = pa; //将pa的地址给p。
38 cout << *p << endl;
39 cout << *pa << endl;
40
41 *pa = 100;//将pa地址的值改成100;pa地址对应变量a,看下a中的值是否已经修改!
42 cout << a <<" "<<*pa<<endl; //都是100
43
44 *p = 300;
45 cout << a << " " << *pa << " " << *p << endl;//前面p=pa,将p和pa的地址等效了。感觉和变量的赋值是有区别的。
46
47 //更新后的C++指针必须要初始化的。可以先给个空。
48 int* p1 = 0; //表示指向空。
49 int* p2 = NULL;//表示指向空。
50 int* p3 = nullptr;//C++11中使用的指向空的方式,推荐使用。
51 cout << p1 << " " << p2 << endl;
52
53 //空类型的指针。
54 void * q; //q可以接收任意类型的地址。
55 q =&a; //虽然&a的值是int类型,但是将a的地址给q后,q还是任意类型的指针。这里和auto不是一个概念。
56 //q = &b
57 //cout << *q << endl; //错误写法,由于q是任意类型的指针,系统不知道需要多大的地址,所以无法输出q指针
58 //需要先进行类型转换
59 cout << *((int*)q) <<endl; //(int*)是将任意类型的p指针转换成int类型的指针,再 *((int*)p)得到指针对用的值。
60
61 //————————通过new申请内存和 通过delete释放内存————————
62
63 //int* s = nullptr; //定义并初始化一个int类型的指针。
64 int* s = new int; //定义一个int类型的指针并自己开辟一个int类型的内存空间。
65 *s = 100; //给指针s对应的地址的值赋值100
66 cout << *s << endl; //由于这块内存地址没有变量的设定,所以只能通过指针进行访问。
67
68 //变量的值和变量的地址的区别?
69 //变量地址是房间的号码,而变量的值是房间里的东西。可以通过变量取得房间里东西,也可以通过指针取得房间里的东西。指针里存着房间的号码。
70
71 //new出来的内存区域不用了一定要用delete释放掉。通过变量申请到的内存是自动释放的。
72 delete s; //delete+指针名。
73
74 int t;
75 cin >> t;
76 return 0;
77 }