1.指针变量的定义和使用
#include <iostream>
using namespace std;
#include"swap.h"
int main()
{//定义指针
int a = 10;
//指针定义的语法:数据类型*指针变量名
int* p;
//让指针记录变量a的地址
p = &a;
cout << "a的地址为:" << &a << endl;
cout << "指针p的地址为:" << p << endl;
//使用指针
//可以通过解引用的方式来找到指针指向的内存
//指针前加*代表解引用,找到指针指向的内存中的数据
*p = 1000;
cout << "a=" << a << endl;
cout << "*p=" << *p << endl;
system("pause");
return 0;
}
2.指针所占空间内存大小
#include <iostream>
using namespace std;
#include"swap.h"
int main()
{//指针所占内存空间大小
int a = 10;
int* p = &a;//这是直接解引用的操作
//在32为操作系统下,指针是占4个字节空间大小,不管是什么数据类型
//在64为操作系统下,指针是占8个字节空间大小,不管是什么数据类型
cout << "sizeof(int*)=" << sizeof(int*) << endl;
cout << "sizeof(int*)=" << sizeof(float*) << endl;
cout << "sizeof(int*)=" << sizeof(char*) << endl;
cout << "sizeof(int*)=" << sizeof(double*) << endl;
system("pause");
return 0;
}
3.空指针和野指针
#include <iostream>
using namespace std;
#include"swap.h"
int main()
{//空指针
//1.空指针用于给指针变量进行初始化
int* p = NULL;
//2.空指针是不可以进行访问的
//0~255之间的内存编号是系统占用的,因此不可以访问
//*p=100;运行这条指令会报错,原因如上;
system("pause");
return 0;
}
#include <iostream>
using namespace std;
#include"swap.h"
int main()
{//野指针--指针变量指向非法的内存空间
int* p = (int*)0x1100;
//访问野指针报错
cout << *p << endl;
system("pause");
return 0;
}
总结:空指针和野指针都不是我们申请的空间,因此不要访问你
4.const修饰指针
const int*p=&a;//常量指针--可以修改指向,但不可以修改指向内存中的内容;
int *const p=&a;//指针常量--指针的指向不可以改,指针的指向的值可以改;
const int *const p=&a;//const即修饰指针又修饰常量--指针的指向和指针指向的值都不可以修改
5.指针和数组
作用:利用指针访问数组中的元素
#include <iostream>
using namespace std;
#include"swap.h"
int main()
{//利用指针访问数组中的元素;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;//数组名即为数组的第一个元素的首地址;
for (int i = 0; i < 10; i++)
{
//利用指针遍历整个数组
cout << *p << endl;
p++;//它是自动加四个字节,因为这里我们定义的是整型数组
}
system("pause");
return 0;
}
6.指针和函数
作用:利用指针作函数参数,可以修改实参的值
#include <iostream>
using namespace std;
#include"swap.h"
//值传递
void swap1(int a, int b)
{
int temp = 0;
temp = a;
a = b;
b = temp;
}
//地址传递
void swap2(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int 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;
}
总结:如果不想修改实参就用值传递,想修改实参就用地址传递
7.指针,数组,函数案例
案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序
#include <iostream>
using namespace std;
//冒泡排序函数
void bubbleSort(int* arr, int len)
{
for (int j = 0; j < len - 1; j++)
{
for (int i = 0; i < len - j - 1; i++)
{
if (arr[i] > arr[i + 1])
{
int temp = 0;
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
}
//打印数组函数
void printArray(int* arr, int len)
{
for (int k = 0; k < 10; k++)
{
cout << arr[k] << " ";
}
}
int main()
{
int arr[10] = { 4,2,8,9,4,6,1,10,7,5 };
int len = sizeof arr / sizeof arr[0];
bubbleSort(arr, len);//注意怎么传输数组数据
printArray(arr, len);
system("pause");
return 0;
}