5.1 指针的基本概念
指针的作用:可以通过指针直接访问内存,指针内保存着地址
- 内存编号从0开始,一般用十六进制数表示
- 可以利用指针变量保存内存地址
5.2 指针的定义和使用
5.2.1 指针的定义
int a=10;
int *p;
p=&a;
5.2.2 指针的使用
可以通过某种方式来找到指针指向的内存,并对这块内存进行操作。其中,解引用和直接引用是两种常见的方式,当数据为基本数据类型的时候,使用解引用;当数据是数组之类的数据时直接引用,如下代码所示。
#include<iostream>
using namespace std;
int main() {
int arr[] = {1,2,3};
int * p= arr;
cout << *p << endl;
int a = 9;
// int * p;
p = &a;
cout << *p << endl;
system("pause");
/*
输出:
1
9
*/
}
5.2.3 空指针和野指针
- 空指针:
- 空指针用于给指针变量进行初始化(int * p=Null)
- 空指针是不可以尽心访问的
- 野指针
- 直接给指针赋值,int * p=(int *) 0x1111; 由于内存0x1111并没有真的被申请,访问会报错;
空指针和野指针都不应该在程序中出现,要尽量避免
5.2.4 const 修饰指针
- const int * p=&a; 常量指针 指针的指向可以修改,但是指针指向的值不可以修改
const int * p=&a;
*p=100;//会报错,指向的值不可以修改
p=&b;// 正常运行,指针的指向可以修改
- int * const p=&a; 指针常量 指针指向不可以改,但是指针指向的值都可以修改
int * const p=&a;
*p=100;// 可以修改
p=&b;// 报错
- const int * const p=&a; 指针指向和指针的值都不可以修改
5.2.5 指针和数组
指针的作用是更快速的访问数据,例如数组
- 指针加一是向后移动单位个字节(移动字节的数目和指针的类型所占的字节相同,例如 int型的指针p++ 移动四个字节 long long 型指针p++ 移动八个字节)
#include<iostream>
using namespace std;
int main() {
long long arr[] = {1,2,3};
long long * p= arr;
cout << *p << endl;
p++; // 指针加一是向后移动单位个字节(移动字节的数目和指针的类型所占的字节相同)
cout << *p << endl;
system("pause");
}
5.2.5 指针和函数
在函数内直接修改变量的值,可以使用指针
#include<iostream>
// #include"myfunc.h"
using namespace std;
int swap(int * p1, int *p2);
int main() {
int num1=1;
int num2 = 2;
int* p1 = &num1;
int* p2 = &num1;
swap(*p1, *p2);
cout << num1 << endl;
cout << num2 << endl;
swap(&num1, &num2);
cout << num1 << endl;
cout << num2 << endl;
system("pause");
}
int swap(int * p1, int * p2) {
int tmp=*p1;
*p1 = *p2;
*p2 = tmp;
return 0;
}