一、概述
作用:可以通过指针,间接的访问内存
- 内存的编号是从0开始记录的,一般用十六进制数字表示
-
二、指针变量的定义和使用
指针变量定义语法: 数据类型 变量名;
*示例1:#include <iostream>
using namespace std;
int main()
{
int a = 10;
int *p;
p= &a;
cout << "a的地址为:"<< p << endl;
return 0;
}
结果:
示例2:#include <iostream> using namespace std; int main() { int a = 10; int *p; p= &a; cout << "a的值为:"<< *p << endl; return 0; }
结果:
注意:“&”代表取址符,就是获取一个变量的内存地址,”*”代表解引用,是获取该指针地址内存储的实际的值三、指针占用的内存空间
在32位操作系统下指针占用4个字节
- 在64位操作系统下指针占用8个字节
示例:
#include <iostream>
using namespace std;
int main()
{
cout << "sizeof(int *)所占用的空间为:" << sizeof(int *) << endl;
cout << "sizeof(float *)所占用的空间为:" << sizeof(float *) << endl;
cout << "sizeof(double *)所占用的空间为:" << sizeof(double *) << endl;
cout << "sizeof(char *)所占用的空间为:" << sizeof(char *) << endl;
return 0;
}
四、空指针和野指针
空指针:指针变量指向内存中编号为0的空间 int p=NULL
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
*示例1:空指针
int main()
{
int *p=NULL; //1、空指针用于给指针变量进行初始化
cout<<*p<<endl;
}
野针指:指针变量指向非法的内存空间
示例2:
int *p=(int*)0x1100; //指针指向0x1100这个地址
cout<<*p<<endl;
结果:
注意:空指针和野指针都是不能够访问的空间
五、const修饰指针
const修饰指针有三种情况:
- const修饰指针:常量指针
- const修饰常量 :指针常量
- const即修饰针指,又修饰常量
示例:常量指针
const int *p=NULL;
#include <iostream>
using namespace std;
int main()
{
int a = 1, b = 2;
const int* p = NULL;
p = &b;
cout << p << endl;
cout << *p << endl;
p = &a;
cout << p << endl;
cout << *p << endl;
return 0;
}
结果:
特点:指针的指向可以修改,但是指针指向的值不可以改
示例:指针常量
int * const p=&a;
#include <iostream>
using namespace std;
int main()
{
int a = 1, b = 2;
int * const p = &b;
cout << p << endl;
cout << *p << endl;
*p = a;
cout << p << endl;
cout << *p << endl;
return 0;
}
结果:
特点:指针的指向不可以修改,但是指针指向的值可以改
示例:const既修饰指针又修饰常量
const int * const p=&a;
六、指针和数组的使用
作用:利用指针访问数组内的每个元素
示例:
#include <iostream>
using namespace std;
int main()
{
int arry[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "数组的第一个元素:" << arry[0] << endl;
int* p = arry;
cout << "利用指针访问数组的第一个元素:" << *p << endl;
p++;
cout << "移动指针访问数组的第二个元素:" << *p << endl;
return 0;
}
结果:
注意:如果指针指向数组名,数组名就是数组的首地址,如果指针和数组为相同的数据类型,比如都是int类型,那么p++指针就会自动向后移动4个字节,就是下第二个元素的地址
七、指针和函数
作用:利用针针作函数的形参,可以修改实参的值
示例:
#include <iostream>
using namespace std;
void swap(int* a, int* b)
{
cout << "交换前:a= " << *a << " b= " << *b << endl;
int temp = *a;
*a = *b;
*b = temp;
cout << "交换后:a= " << *a << " b= " << *b << endl;
}
int main()
{
int a=10;
int b=20;
swap(&a, &b);
cout << "实际a= " << a << " 实际b= " << b << endl;
return 0;
}
结果:
注意:这里是实现的地址交换,我们看到地址交换会将实参的内容改变
八、指针、数组、函数
案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序
例如数组:int arry[10]={4,3,6,9,1,2,10,8,7,5};
示例:
#include <iostream>
using namespace std;
void maopao(int *arry,int len)
{
int temp;
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (arry[j] > arry[j + 1])
{
temp = arry[j];
arry[j] = arry[j+1];
arry[j+1] = temp;
}
}
}
}
void print(int* arry, int len)
{
for (int i = 0; i < len; i++)
{
cout << arry[i] << endl;
}
}
int main()
{
int arry[10] = { 4,3,6,9,1,2,10,8,7,5 };
int len = sizeof(arry) / sizeof(arry[0]);
maopao(arry, len);
print(arry, len);
return 0;
}
结果: