一、基本概念
指针的作用: 可以通过指针间接访问内存,内存编号是从0开始记录的,一般用十六进制数字表示,可以利用指针变量保存地址。
二、定义和使用
#include <iostream> using namespace std; int main() { int a = 10; // 1、定义指针 数据类型* 指针变量名 int *p; //指针记录变量a的地址 p = &a; cout << " &a =" << &a << endl; cout << "p =" << p << endl; // 2、使用指针 //可以通过解引用的方式找到指针指向的内存 在指针前边加*表示解引用,找到指针指向的内存中的数据。 *p = 1000; cout << "a =" << a << endl; cout << "*p =" << *p << endl; return 0; }
&a =0x63fe14 p =0x63fe14 a =1000 *p =1000
三、指针所占的内存空间
#include <iostream> using namespace std; int main() { //指针在32位系统下,占用4个字节;64位系统下,占用8个字节。 cout<<sizeof(int *)<<endl; cout<<sizeof(bool *)<<endl; cout<<sizeof(float *)<<endl; cout<<sizeof(double *)<<endl; cout<<sizeof(char *)<<endl; return 0; }
8 8 8 8 8
四、空指针和野指针
空指针: 指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
野指针: 指针变量指向非法的内存空间
#include <iostream> using namespace std; int main() { //1、空指针 int *p = NULL; *p = 100; //2、野指针 int *p1 = (int *) 0x1100; cout << *p1 << endl; return 0; }
五、const修饰指针
#include <iostream> using namespace std; int main() { int a = 10; int b = 20; //1、const修饰指针 常量指针 不能修改值,可以修改指针的指向 const int *p = &a; p = &b; //2、const修饰常量 指针常量 不能修改指向,可以修改值 int *const p2 = &a; *p2 = 20; //3、const修饰常量和指针 指向和指都不能修改 const int *const p3 = &a; return 0; }
六、指针和数组
#include <iostream> using namespace std; int main() { // 指针访问数组 int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 数组的地址是否是第一个元素的地址 cout << (arr == &arr[0]) << endl; // 指针指向数组 int *p = arr; // 计算数组的长度 int length = sizeof(arr) / sizeof(arr[0]); // 利用指针遍历数组 for (int i = 0; i < length; ++i) { cout << *p << endl; p++; } return 0; }
1 1 2 3 4 5 6 7 8 9
七、指针和函数
#include <iostream> using namespace std; //实现两个数字进行交换 //值传递 void swap01(int a, int b) { int tem = a; a = b; b = tem; cout << "swap01 a=" << a << endl; cout << "swap01 b =" << b << endl; } //指针 地址传递 void swap02(int *a, int *b) { int tem = *a; *a = *b; *b = tem; cout << "swap02 a=" << *a << endl; cout << "swap02 b =" << *b << endl; } int main() { // 指针和函数 修改值用地址传递,不修改值,用值传递 //1、值的传递 int a = 10; int b = 20; swap01(a, b); cout << "a=" << a << endl; cout << "b =" << b << endl; //2、地址传递 swap02(&a, &b); cout << "a=" << a << endl; cout << "b =" << b << endl; return 0; }
swap01 a=20 swap01 b =10 a=10 b =20 swap02 a=20 swap02 b =10 a=20 b =10
八、指针、数组、函数
#include <iostream> using namespace std; //冒泡排序函数 void bubbleSort(int *arr, int len) { for (int i = 0; i < len - 1; ++i) { for (int j = i + 1; j < len; ++j) { if (arr[j] > arr[i]) { int tem = arr[j]; arr[j] = arr[i]; arr[i] = tem; } } } } int main() { // 1、创建数组 int arr[10] = {4, 3, 6, 9, 1, 2, 10, 8, 7, 5}; int len = sizeof(arr) / sizeof(arr[0]); //2、排序 bubbleSort(arr, len); //3、打印 for (int i = 0; i < len; ++i) { cout << arr[i] << endl; } return 0; }