指针
1 指针的基本概念
指针的作用
:可以通过指针间接访问内存。
- 内存编号是从0开始记录的,一般用十六进制数字表示
- 可以利用指针变量保存地址
2 指针的定义
#include <iostream>
using namespace std;
int main(){
int a = 10;
//定义指针
int *p;
//给指针复制
p = &a;
cout << &a << endl;
cout << p << endl;
cout << "a 的值为:" << a << endl;
cout << "p 指向的内存保存的值为: " << *p << endl;
cout << "指针变量所占内存大小: " << sizeof(p) << endl;
system("pause");
}
3 指针所占内存空间
32位 4 字节
64位 8 字节
不确定,与操作系统也有关系
4 空指针与野指针
空指针
:指针变量指向内存中编号为0的空间
用途
:初始化指针变量
注意:空指针指向内存是不可访问的
示例1:空指针
int main(){
//指针变量p指向内存地址编号为0的空间
int * p = NULL;
//访问空指针报错
//内存编号0 ~255为系统占用内存,不允许用户访问
cout << *p << endl;
system("pause");
return 0;
}
野指针
:指针变量指向非法空间的内存空间
示例2:野指针
int main() {
//指针变量p指向内存地址编号为0x1100的空间
int * p = (int *)0x1100;
//访问野指针报错
cout << *p << endl;
system("pause");
return 0;
}
5 const修饰指针
const修饰指针有三种情况
- const修饰指针 —> 常量指针
- const修饰常量 —> 指针常量
- const即修饰指针,又修饰常量
#include <iostream>
using namespace std;
int main(){
int a = 10;
int b = 20;
//常量指针:可以修改指针指向的地址,不能修改指向地址的值。
int * const pa = &a;
*pa = 30;
//指针常量:可以修改指向地址的值,不能修改指针指向的地址。
const int *pb = &b;
pb = &b;
return 0;
}
6 指针和数组
利用指针访问数组中的元素
示例
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int * p = arr; //指向数组的指针
cout << "第一个元素: " << arr[0] << endl;
cout << "指针访问第一个元素: " << *p << endl;
for (int i = 0; i < 10; i++)
{
//利用指针遍历数组
cout << *p << endl;
p++;
}
system("pause");
return 0;
}
7 指针和函数
作用
:利用指针作函数参数,可以修改实参的值
示例
:
//值传递
void swap1(int a ,int b)
{
int 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;
}
8 指针、数组、函数
**案例描述:**封装一个函数,利用冒泡排序,实现对整形数组的升序排序
示例:
//冒泡排序函数
void bubbleSort(int * arr, int len) //int * arr 也可以写为int arr[]
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; 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,6,9,1,2,10,8,7,5 };
int len = sizeof(arr) / sizeof(int);
bubbleSort(arr, len);
printArray(arr, len);
system("pause");
return 0;
}
为什么(sizeof 数组名)可以求得整个数组的长度
#define mysizeof(L_Value) ((char*)(&L_Value + 1) - (char*)(&L_Value))
**&数组名:**表示指向数组的地址因此&L_Value + 1可以越过整个数组。