C++ 12.指针—作用、所占内存空间、空指针、野指针、const修饰指针、指针与数组、指针与函数、指针、数组、函数的案例(冒泡排序)

目录

指针的作用

指针所占内存空间

空指针

 野指针

const修饰指针有三种情况

指针和数组

 指针和函数

 指针、数组、函数的案例


指针的作用

可以通过指针间接访问内存。可以通过指针来保存一个地址。
注意事项:内存编号是从0开始记录的,一般用十六进制数字表示;可以利用指针变量保存内存
指针变量定义语法:数据类型 * 指针变量名

#include 
using namespace std;
int main()
{
	//1.定义指针
	int a = 10;
	//指针定义的语法:数据类型 * 指针变量名
	int * p;
	//让指针记录变量a的地址(建立变量与指针连接)
	p = &a;
	cout << "a的地址为" << &a << endl;
	cout << "指针p为" << p << endl;

	//2.使用指针
	//解引用:指针前加*,找到指针指向的内存中的数据(*p)
	*p = 1000;
	cout << "a=" << a << endl;
	cout << "*p=" << *p << endl;

	system("pause");
	return 0;
}

指针所占内存空间

指针也是一种数据类型,这种数据占多少内存
在32位操作系统下:占用4个字节空间
在64位操作系统下:占用8个字节空间

int main()
{
	//指针所占内存空间
	int a = 10;
	//int * p;
	//p = &a;//与下一行等价

	int * p = &a;

	//在32位操作系统下,指针是占4字节空间大小,不管是什么数据类型
	//在64位操作系统下,指针是占8字节空间大小
	cout << "sizeof (int *)=" << sizeof(p) << endl;
	cout << "sizeof (int *)=" << sizeof(int *) << endl;//等价与上一行代码
	cout << "sizeof (float *)=" << sizeof(float *) << endl;
	cout << "sizeof (double *)=" << sizeof(double *) << endl;

	system("pause");
	return 0;
}

空指针

指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的;0~255之间的内存编号是系统占用的,因此不可以访问

int main()
{
	int * p = NULL;//初始化指针变量
	//*p = 100;//空指针指向的内存是不可以访问的
	cout << *p << endl;//报错

	system("pause");
	return 0;
}

 野指针

指针变量p指向非法的内存空间

int main()
{
	//指针变量p指向内存地址编号为0x1100的空间
	int * p = (int *)0x1100;
	//访问野指针报错
	cout << *p << endl;

	system("pause");
	return 0;
}

const修饰指针有三种情况

1.const修饰指针——常量指针(const修饰指针*p,指针指向的值不能改)
2.const修饰常量——指针常量(const修饰常量p,指针指向不能改)
3.const既修饰指针,又修饰常量

int main()
{
	//1.const修饰指针。指针指向可以修改,指针指向的值不可以修改
	int a = 10;
	int b = 10;
	const int *p = &a;//指针P指向a
	p = &b;//正确,指针指向可以修改
	//*p = 20;//错误,指针指向的值不可以修改
	
	//2.const修饰常量。指针指向的值可以修改,指针指向不可以修改
	int * const q = &a;
	*q = 20;//正确,指针指向的值可以修改
	//q = &b;//错误,指针指向不可以修改
	
	//3.const既修饰指针,又修饰常量。指针指向的值和指针指向都不可以修改
	const int * const r = &a;
	//r = &b;//错误,指针指向不可以修改
	//*r = 20;//错误,指针指向的值不可以修改

	system("pause");
	return 0;
}

C++ 12.指针—作用、所占内存空间、空指针、野指针、const修饰指针、指针与数组、指针与函数、指针、数组、函数的案例(冒泡排序)_第1张图片C++ 12.指针—作用、所占内存空间、空指针、野指针、const修饰指针、指针与数组、指针与函数、指针、数组、函数的案例(冒泡排序)_第2张图片

指针和数组

作用:利用指针访问数组中元素

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	cout << "第一元素为" << arr[0] << endl;

	int * p = arr;//arr就是数组的首地址
	cout << "利用指针来访问第一个元素" << *p << endl;
	p++;//让指针向后偏移4个字节
	cout << "利用指针来访问第二个元素" << *p << endl;

	cout << "利用指针来遍历数组" << endl;
	int *p2 = arr;//arr就是数组的首地址
	for (int i = 0; i < 10; i++)
	{
		//cout << arr[i] << endl;
		cout << *p2 << endl;
		p2++;
	}

	system("pause");
	return 0;
}

 指针和函数

实现两个数字交换

//实现两个数字交换
void swap01(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << "swap01 a=" << a << endl;
	cout << "swap01 b=" << b << endl;
}
void swap02(int *p1, int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main()
{
	int a = 10;
	int b = 20;
	//1.值传递,不会改变实参的值
	//swap01(a, b);
	//cout << "a=" << a << endl;
	//cout << "b=" << b << endl;

	//2.地址传递,会改变实参的值
	swap02(&a, &b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

	system("pause");
	return 0;
}

 指针、数组、函数的案例

封装一个函数,利用冒泡排序,实现对整型数组的升序排序

//冒泡排序
void bubbleSort(int *arr, int len)//int *arr可以写成int arr[]
{
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len-i-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,3,2,5,8,9,1,7,10,6 };
	int len = sizeof(arr) / sizeof(arr[0]);
	bubbleSort(arr,len);
	printArray(arr, len);
	system("pause");
	return 0;
}

                      C++ 12.指针—作用、所占内存空间、空指针、野指针、const修饰指针、指针与数组、指针与函数、指针、数组、函数的案例(冒泡排序)_第3张图片            C++ 12.指针—作用、所占内存空间、空指针、野指针、const修饰指针、指针与数组、指针与函数、指针、数组、函数的案例(冒泡排序)_第4张图片

你可能感兴趣的:(c++)