1、指针的基本概念
作用
可以通过指针间接访问内存
- 内存编号是从0开始记录的,一般用十六制数字表示
- 可以利用变量保存地址
2、指针变量的定义和使用
语法
数据类型 * 变量名;
实例
#include <iostream> using namespace std; int main() { int a = 10; int * p; p = &a; cout<<"a的地址为: "<<&a<<endl; cout<<"p的值为: "<<p<<endl; //通过指针修改a的值 *p = 23; cout<<"修改后a的值为:"<<a<<endl; cout<<"p的值为:"<<p<<endl; return 0; }
指针变量和普通变量的区别
- 普通变量存放的是数据,指针变量存放的是地址
- 指针变量可以通过“*”操作符,操作指针变量指向的内存空间,这个过程成为解引用
总结1:我们可以通过 & 符号获取变量的地址
总结2:利用指针可以记录地址
总结3:对指针变量解引用,可以操作指针指向的内存
3、指针所占内存空间
注:指针也是中数据类型
实例
#include <iostream> using namespace std; int main() { int a = 10; int* p = &a; cout << "pΪ: " << p << endl; cout << "sizeof int *= " << sizeof(int*) << endl; cout << "sizeof int *= " << sizeof(p) << endl; system("pause"); return 0; }
总结:所有指针类型在32位操作系统下是4个字节,在64位操作系统下是8个字节
4、空指针和野指针
空指针
指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
实例
#include <iostream> using namespace std; int main() { int a = 10; int* p = &a; cout << "空指针:" << p << endl; cout << "空指针:" << *p << endl; system("pause"); return 0; }
总结:空指针和野指针都不是我们申请的空间,因此不要访问。
5、const修饰指针
三种情况
- const修饰指针 —- 常量指针
- const修饰常量 —- 指针常量
- const既修饰指针,又修饰常量
#include <iostream> using namespace std; int main() { int a = 10; int b = 20; //const修饰的是指针,指针指向可以改,指针指向的值不可以更改 const int* p = &a; cout << "p修改前:" << p << endl; //*p = 20; 错误 p = &b; cout << "p修改后:" << p << endl; /*----------------------------*/ //const修饰的是常量,指针指向的值可以更改,指针指向不可以更改 int* const p1 = &a; //p1 = &b; *p1 = 20; cout << "p1修改前:" << p1 << endl; cout << "p1修改后:" << p1 << endl; /*----------------------------*/ //const既修饰常量又修饰指针 const int* const p3 = &a; system("pause"); return 0; }
技巧:看const右侧紧跟着的是指针还是常量,是指针就是常量指针,是常量就是指针常量
6、指针和数组
作用
利用指针访问数组中的元素
实例
//指针和数组 #include <iostream> using namespace std; int main() { int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int* p1 = arr; cout << "数组中的第一个元素为:" << *p1 << endl; //利用指针遍历这个数组 int* p2 = arr; cout << "遍历数组得:" << endl; for (int i = 0; i<10;i++) { cout << *p2 << endl; p2++; } system("pause"); return 0; }
7、指针和函数
作用
利用指针作函数参数,可以修改实参的值
实例
//指针与函数 #include <iostream> using namespace std; void swap(int * p1, int * p2) { int temp = *p1; *p1 = *p2; *p2 = temp; } int main() { int a = 10; int b = 20; swap(&a, & b); cout << "a= " << a << endl; cout << "b= " << b << endl; system("pause"); return 0; }
总结:如果不想修改实参,就用值传递;如果想修改实参,就用地址传递。
8、指针、数组、函数
案例描述
封装一个函数,利用冒泡排序,实现对整型数组的升序排列。
实例
#include <iostream> using namespace std; void buddleSort(int* arr, int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } void printArray(int arr[], int len) { for (int i = 0; i < len; i++) { cout << arr[i] << endl; } } int main() { int arr[10] = { 4,5,6,7,1,8,2,9,3,0 }; int len = sizeof(arr) / sizeof(int); buddleSort(arr, len); printArray(arr, len); system("pause"); return 0; }
总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针