文章目录
-
- 6 指针
-
- 6.1 指针的基本概念
- 6.2 定义和使用指针变量
- 6 .3 指针占用内存空间
- 6.4 空指针和野指针
- 6.5 const 修饰的指针
- 6.6 指针和数组
- 6.7 指针和函数
- 6.8 指针、数组、函数
- 感谢您的赞扬、评论和转发 \( ^ o ^)/~。
6 指针
6.1 指针的基本概念
:内存可以通过指针间访问。
- 内存编号从0开始记录,通常用16进制数字表示。
- 地址可以用指针变量保存。
6.2 指针变量的定义和使用
: 数据类型 * 指针变量名;
#include<iostream> using namespace std; int main() {
//1.定义指针 int a = 32; int* p; ///让指针记录变量a的地址 p = &a; cout << "a变量地址为:" << &a << endl; cout << "p = " << p << endl; /*2,使用指针 指针指向的内存指针指向的内存 指针前加 * 在指针指向的内存中找到数据代表解引用 */ cout << "*p = " << *p << endl; ///指针解引用 *p = 100; cout << "间接修改后a = " << a << endl; cout << "间接修改指针地址 p = " <<p<< endl; cout << "间接修改指针后的指针 *p = " <<*p<< endl; system("pause"); return 0; } 结果:
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-wVbZmYmV-1647678543784)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319135050400.png)]
6 .3 指针占用内存空间
问题:指针也是一种数据类型,那么这种数据类型占用了多少内存空间呢?
例如:int 在32位操作系统下,类型指针占4个字节,在64位系统下占8个字节。
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-kSRvJ74l-1647678543789)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319135547897.png)]
#include<iostream>
using
namespace std
;
int
main42
(
)
{
//1.定义指针
int a
=
32
;
int
* p
;
//让指针记录变量a的地址 p
=
&a
; cout
<<
"a变量的地址为:"
<<
&a
<< endl
; cout
<<
"p = "
<< p
<< endl
;
/*2,使用指针 通过解引用的方式来找到指针指向的内存 指针前加 * 代表解引用,找到指针指向的内存中的数据 */ cout
<<
"*p = "
<<
*p
<< endl
;
//指针的解引用
*p
=
100
; cout
<<
"通过间接修改后a = "
<< a
<< endl
; cout
<<
"通过指针间接修改后的指针地址 p = "
<<p
<< endl
; cout
<<
"通过指针间接修改后的指针 *p = "
<<
*p
<< endl
;
system
(
"pause"
)
;
return
0
;
}
6.4 空指针和野指针
:指针变量指向内存中编号为0的空间。
:初始化指针变量。
:空指针指向的内存是不可以访问的。
#include<iostream>
using namespace std;
int main()
{
//空指针
//1.空指针用于指针变量进行初始化
int* p = NULL;
//2.空指针是不可以进行访问的
//0~255之间的内存编号是系统占用的,因此不可以访问
*p = 100;
system("pause");
return 0;
}
:指针变量指向非法的内存空间
#include<iostream>
using namespace std;
int main()
{
//野指针
//指针变量p指向内存地址编号为0x1100的空间
int* p = (int *)0x1100;
cout << *p << endl;
system("pause");
return 0;
}
:在编程过程中要避免出现野指针和空指针,它们是挺危险的
6.5 const 修饰的指针
const修饰指针有三种情况:
- const修饰指针…常量指针(指针指向的值不可以改,指针的指向可以改)
- const修饰常量…指针常量(指针指向的值可以改,指针的指向不可以改)
- const即修饰指针,又修饰常量 (指针的指向和指针所指向的值 都不可以改)
#include<iostream>
using namespace std;
int main()
{
//1.const修饰指针 常量指针
int a = 10, b = 20;
const int* p = &a; //指针*p指向a
//指针指向的值不可以改,指针的指向可以改
//*p = 20;错误
p = &b; //指针的指向可以修改,正确
//2.const修饰常量 指针常量
//指针指向的值可以改,指针的指向不可以改
int* const p2 = &a;
*p2 = 34;//正确
//p2 = &b;//错误,指针的指向不可以修改
//3.const修饰指针和常量
const int* const p3 = &a;
//指针的指向和指针所指向的值 都不可以改
//*p3 = 100; 错误
//p3 = &b; 错误
system("pause");
return 0;
}
6.6 指针和数组
:利用指针访问数组中元素
#include<iostream>
using namespace std;
int main()
{
/* 指针和数组 利用指针访问数组中的元素 */
int arr[] = {
1,2,3,4,5,6,7,8,9,10 };
//cout << "第一个元素为:" << arr[0] << endl;
cout << "第一个元素为:" << *arr << endl;
int* p = arr; //arr就是数组首地址
cout << "* p =" << *p << endl;
p++; //因为*p是四节的指针,自增1后指向下一个元素
cout << "利用指针遍历数组:" << endl;
int* p2 = arr;
for (int i = 0; i < 10; i++)
{
cout << "arr ["<<i<<"] = " << *p2 << endl;
p2++; //通过指针自增指向下一个元素
}
system("pause");
return 0;
}
6.7 指针和函数
:利用指针做函数参数,可以修改实参的值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aL57eTV3-1647678543799)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319154420716.png)]
#include<iostream>
using namespace std;
//值传递
void swap1(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
cout << "swap1中a = " << a << endl;
cout << "swap1中b = " << b << endl;
}
//地址传递
void swap2(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10, 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;
}
6.8 指针、数组、函数
:封装一个函数,利用冒泡排序,实现整形数组的排序,例如:int arr[10] = {4,3,6,9,1,2,10,8,7,5};
#include<iostream>
using namespace std;
//2.创建冒泡排序函数 参数1是数组的首地址 参数2是数组长度
void bubbleSort(int* arr, int len) //也可以写为int arr[]
{
for (int i = 0; i < len; i++)
{
for (int j =0; j < len - 1 - i; j++)
{
int temp = 0;
if (arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 3.打印数组输出
void printArr(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "arr [" << i << " ] =" << arr[i] << endl;
}
}
int main()
{
//1.先创建数组
int arr[10] = {
4,3,6,9,1,2,10,8,7,5 };
int len = sizeof(arr) / sizeof(arr[0]);
//2.创建冒泡排序函数
//3.调用冒泡排序函数
bubbleSort(arr, len);
//4.打印排序后的数组输出
printArr(arr,len);
system("pause");
return 0;
}