指针的作用:可以间接访问内存地址。可以利用指针变量保存地址。
内存地址的编号:地址是十六进制组成,所以内存地址编号中的数字或字母都是从0-F中选择的。
在十六进制中,是不能出现16的,也就是字母G。
十六进制的一位数表示方式和范围:0,1,2,3,4,5,6,7,8,9
十六进制的两位数表示方式和范围:A=10, B=11, C=12, D=13, E=14 ,F=15
指针变量定义的语法:数据类型 * 指针变量名;
指针变量记录变量地址的语法:指针变量=& 变量;
两种语法合体:数据类型 * 指针变量=& 变量;
#include
using namespace std;
int main()
{
int a = 10;//定义一个整型变量a
//1.定义一个指针
int* p; //point是指针的意思,所以我用了首字母p
p = &a;//让指针p记录变量a的地址,用and符连接
cout << "指针p为:" << p << endl;//得出的结果是一个十六进制的数
//2.使用指针
//可以通过解决引用的方式来找到指针指向的内存,通过间接访问,可以完成读和写的操作
*p = 100;//指针前面加一个星号,叫做解引用,可以找到指针指向的内存中的数据
cout << "a=" << a << endl;
cout << "*p=" << *p << endl;
return 0;
}
int * p;p=&a;也可以写成int *p=&a;
指针变量名p与整型变量a建立关系,用图像理解
结论:指针也是一种数据类型,也占内存空间。
用sizeof()的方法来查询指针内存。
#include
using namespace std;
int main()
{
int a = 10;
int* p = &a;//定义指针变量,再用指针变量记录变量a
cout << "int * p=" << p << endl; //得到的结果为十六进制
cout << "sizeof int * p=" << sizeof(p) << endl; //指针变量所占内存为4
cout << "浮点类型所占内存为" << sizeof(float *); //输出浮点类型的指针内存
}
空指针:指针变量指向内存中编号为0的内存空间。
空指针的用途:指针变量的初始化。相当于给指针变量划分了一个空的内存空间。
注意事项:空指针的内存是不可以访问的。
#include
using namespace std;
int main()
{
int* p = NULL; //指向一个地址为0的内存编号
cout << *p << endl; //访问指针出现错误
//因为内存编号0-255为系统占用内存,不允许用户访问
return 0;
}
用自己的话来说,我们是不能对空指针进行访问的。
野指针:指针变量指向非法的内存空间。
用自己的话来说,相当于做了比较过分的事情。
从下面的代码可以看出,编号是自己写的,没有用正确的编号。
这样的写法,很容易给程序带来不必要的异常。
#include
using namespace std;
int main()
{
int * p = (int*)0x0100;//指针变量p指向内存地址编号为0x0100
cout << * p << endl;//访问野指针,和空指针一样不能被访问
return 0;
}
int a=10; // 高级解释:创建一个内存空间。
①const修饰常量
#include
using namespace std;
int main()
{
int a = 10;
const int* p = &a;
return 0;
}
结论:指针指向的值不可以改,指针的指向是可以改的。
②const修饰指针
#include
using namespace std;
int main()
{
int a = 10;
int * const p = &a;
return 0;
}
结论:指针指向的值可以改,指针的指向是不可以改的。
③const既修饰指针,又修饰常量
#include
using namespace std;
int main()
{
int a = 10;
const int * const p = &a;
return 0;
}
结论:指针指向的值不可以改,指针的指向也不可以改的。
作用:利用指针访问数组元素。
#include
using namespace std;
int main()
{
int arr[] = {
1,2,3,4 };//创建一个数组
int * p = arr;//指向指针数组
cout << "第一个元素:" << arr[0] << endl;
cout << "指针访问的第一个元素:" << *p << endl;
for (int i=0;i<4;i++)
{
cout << *p << endl;//利用指针遍历数组
//变量指针指向的是1,所以没了p++,四次的遍历都会指向1
p++;//指针向后偏移
//指针变量需要不断地加1,如果不加,就只能遍历到数组中的第一个元素。
}
return 0;
}
作用:利用指针作为函数参数,可以修改实参的值
值传递(函数参数传值):不能修改实参的值。
#include
using namespace std;
//值传递:无法修改实参的值,所以没有交换成功
void swap1(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << "原来的数:";
cout << "a=" << a << "\t";
cout << "b=" << b << endl;
swap1(a, b);
cout << "交换后的数:";
cout << "a=" << a << "\t";
cout << "b=" << b << endl;
return 0;
}
地址传递(利用指针的方法):可以修改实参的值
#include
using namespace std;
//值传递
void swap1(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << "原来的数:";
cout << "a=" << a << "\t";
cout << "b=" << b << endl;
swap1(&a, &b);//地址传递,修饰实参
cout << "交换后的数:";
cout << "a=" << a << "\t";
cout << "b=" << b << endl;
return 0;
}
#include
using namespace std;
//最大值函数
void Max(int * arr, int len)//参数首地址,数组的长度
{
int max = 0;
for (int i=0;i<len;i++)
{
if (arr[i]>max)
{
max = arr[i];
}
}
cout << "最大值:" << max << endl;
}
//打印数组的函数
void printArray(int * arr,int len)
{
for (int i=0;i<len;i++)
{
cout << arr[i] << endl;
}
}
int main()
{
//1.创建数组
int arr[3] = {
10,20,30 };
//2.获取长度
int len = sizeof(arr) / sizeof(arr[0]);
//3.打印数组的函数
printArray(arr, len);
//4.打印数组中最大的值
Max(arr, len);
return 0;
}
上一篇:C++基础教程11-函数
下一篇:C++基础教程13-结构体