7. 指针
7.1 指针的概念
通过指针访问内存。
7.2 指针变量的定义和使用
数据类型 * 变量名;
e:
int a = 10; int * p; p = &a; //p指向变量a的地址 // 使用指针访问内存 cout <<"*p=" << *p << endl;
7.3 指针所占内存空间
指针存储的是内存地址。 所以,如果计算机是64位的(用64位表示内存),指针的大小就是64位(8个字节)
可以用sizeof查看。
7.4 空指针和野指针
空指针: 指向内存0的指针。一般用于初始化。int *p = NULL;
这个位置是系统保护的,用户无法读写。
如果试图写入数据,如*p=1
。会引起错误。
野指针:指向不确定的内存。
const 修饰指针
常量的指针
const int * p = &a
指针p指向一个常量a,不能用p修改a。
int a = 10; int b = 10; const int * p1 = &a; p1 = &b; //正确 *p1 = 100; // 报错
指向不变的指针
int * const p2 = &a; p2 = &b // 错误
p2指向a后不能在指向其它位置。
两个都不能改
const int * const p3 = &a;
这个很好记,看const离谁近, 离int近,就是这个int是常量, 里p近,就是p是常量。
7.6 指针和数组
用指针访问数组。
int arr[] = {1,2,3,4,5,6,7,8,9,10}; int * p = arr; for (int i=0; i < 10; i++) { cout << *p << endl; p++; }
p++
会让指针根据元素类型,计算下一个元素的内存地址。
7.7 指针和函数
指针作为函数参数,可以修改实参的值。 (因为传入了内存地址,函数可以修改这个地址上的数据)
int swap2(int * p1, int * p2) { int temp = *p1; *p1 = *p2; *p2 = temp; }
7.8 指针、数组、函数
e: 实现冒泡排序函数,对整型数组升序排序。
void bubble_sort(int * arr, int len)//int * arr 也可以写为 int arr[] { for (int i=0; i < len-1; i++) { for (int j=0; j < len -1 -i; j++){ if arr[j] > arr[j+1] { swap2(&arr[j], &arr[j+1]) } } } }