文章目录
6 指针
6.1 指针的基本概念
指针的作用:可以通过指针间访问内存。
- 内存编号是从0开始记录的,一般用十六进制数字表示。
- 可以利用指针变量保存地址。
6.2 指针变量的定义和使用
语法: 数据类型 * 指针变量名;
#include<iostream>
using namespace std;
int main()
{
//1.定义指针
int a = 32;
int* p;
//让指针记录变量a的地址
p = &a;
cout << "a变量的地址为:" << &a << endl;
cout << "p = " << p << endl;
/*2,使用指针
通过解引用的方式来找到指针指向的内存
指针前加 * 代表解引用,找到指针指向的内存中的数据
*/
cout << "*p = " << *p << endl; //指针的解引用
*p = 100;
cout << "通过间接修改后a = " << a << endl;
cout << "通过指针间接修改后的指针地址 p = " <<p<< endl;
cout << "通过指针间接修改后的指针 *p = " <<*p<< endl;
system("pause");
return 0;
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVbZmYmV-1647678543784)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319135050400.png)]
6 .3 指针所占内存空间
提问:指针也是一种数据类型,那么这种数据类型占用多少内存空间?
例如:int 类型的指针在32位操作系统下,占4个字节,64位系统下占用8个字节。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kSRvJ74l-1647678543789)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319135547897.png)]
#include<iostream>
using namespace std;
int main42()
{
//1.定义指针
int a = 32;
int* p;
//让指针记录变量a的地址
p = &a;
cout << "a变量的地址为:" << &a << endl;
cout << "p = " << p << endl;
/*2,使用指针
通过解引用的方式来找到指针指向的内存
指针前加 * 代表解引用,找到指针指向的内存中的数据
*/
cout << "*p = " << *p << endl; //指针的解引用
*p = 100;
cout << "通过间接修改后a = " << a << endl;
cout << "通过指针间接修改后的指针地址 p = " <<p<< endl;
cout << "通过指针间接修改后的指针 *p = " <<*p<< endl;
system("pause");
return 0;
}
6.4 空指针和野指针
空指针:指针变量指向内存中编号为0的空间。
用途:初始化指针变量。
注意:空指针指向的内存是不可以访问的。
#include<iostream>
using namespace std;
int main()
{
//空指针
//1.空指针用于指针变量进行初始化
int* p = NULL;
//2.空指针是不可以进行访问的
//0~255之间的内存编号是系统占用的,因此不可以访问
*p = 100;
system("pause");
return 0;
}
野指针:指针变量指向非法的内存空间
#include<iostream>
using namespace std;
int main()
{
//野指针
//指针变量p指向内存地址编号为0x1100的空间
int* p = (int *)0x1100;
cout << *p << endl;
system("pause");
return 0;
}
注意:在编程过程中要避免出现野指针和空指针,它们是挺危险的
6.5 const 修饰的指针
const修饰指针有三种情况:
- const修饰指针…常量指针(指针指向的值不可以改,指针的指向可以改)
- const修饰常量…指针常量(指针指向的值可以改,指针的指向不可以改)
- const即修饰指针,又修饰常量 (指针的指向和指针所指向的值 都不可以改)
#include<iostream>
using namespace std;
int main()
{
//1.const修饰指针 常量指针
int a = 10, b = 20;
const int* p = &a; //指针*p指向a
//指针指向的值不可以改,指针的指向可以改
//*p = 20;错误
p = &b; //指针的指向可以修改,正确
//2.const修饰常量 指针常量
//指针指向的值可以改,指针的指向不可以改
int* const p2 = &a;
*p2 = 34;//正确
//p2 = &b;//错误,指针的指向不可以修改
//3.const修饰指针和常量
const int* const p3 = &a;
//指针的指向和指针所指向的值 都不可以改
//*p3 = 100; 错误
//p3 = &b; 错误
system("pause");
return 0;
}
6.6 指针和数组
作用:利用指针访问数组中元素
#include<iostream>
using namespace std;
int main()
{
/*
指针和数组
利用指针访问数组中的元素
*/
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//cout << "第一个元素为:" << arr[0] << endl;
cout << "第一个元素为:" << *arr << endl;
int* p = arr; //arr就是数组首地址
cout << "* p =" << *p << endl;
p++; //因为*p是四节的指针,自增1后指向下一个元素
cout << "利用指针遍历数组:" << endl;
int* p2 = arr;
for (int i = 0; i < 10; i++)
{
cout << "arr ["<<i<<"] = " << *p2 << endl;
p2++; //通过指针自增指向下一个元素
}
system("pause");
return 0;
}
6.7 指针和函数
作用:利用指针做函数参数,可以修改实参的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aL57eTV3-1647678543799)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319154420716.png)]
#include<iostream>
using namespace std;
//值传递
void swap1(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
cout << "swap1中a = " << a << endl;
cout << "swap1中b = " << b << endl;
}
//地址传递
void swap2(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10, b = 20;
//值传递函数调用不会改变实参
swap1(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//地址传递函数调用会改变实参
swap2(&a, &b);
cout << "地址调用后 a = " << a << endl;
cout << "地址调用后 b = " << b << endl;
system("pause");
return 0;
}
6.8 指针、数组、函数
案例描述:封装一个函数,利用冒泡排序,实现整形数组的排序,例如:int arr[10] = {4,3,6,9,1,2,10,8,7,5};
#include<iostream>
using namespace std;
//2.创建冒泡排序函数 参数1是数组的首地址 参数2是数组长度
void bubbleSort(int* arr, int len) //也可以写为int arr[]
{
for (int i = 0; i < len; i++)
{
for (int j =0; j < len - 1 - i; j++)
{
int temp = 0;
if (arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 3.打印数组输出
void printArr(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "arr [" << i << " ] =" << arr[i] << endl;
}
}
int main()
{
//1.先创建数组
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
int len = sizeof(arr) / sizeof(arr[0]);
//2.创建冒泡排序函数
//3.调用冒泡排序函数
bubbleSort(arr, len);
//4.打印排序后的数组输出
printArr(arr,len);
system("pause");
return 0;
}