目录
指针的作用
指针所占内存空间
空指针
野指针
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;
}
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;
}
作用:利用指针访问数组中元素
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;
}