07章-指针--C++基础入门学习笔记
7 指针
7.1 指针基本概念
指针的作用: 可通过指针间接访问内存
- 内存编号从0开始记录的,一般用十六进制数表示
- 可以利用指针变量保存地址
7.2 指针变量的定义和使用
指针变量定义语法: 数据类型 *变量名;
示例:
#include<iostream> using namespace std; int main() { //1、定义指针 int a = 10; //2、指定定义的语法:数据类型*指针变量; int* p; //3、让指针记录变量的a的地址 p = &a; cout << "a的地址为:" << &a << endl; cout << "指针p为:" << p << endl; //4、使用指针 //可以通过解引用的方式来找到指针指向的内存 //指针前*代表解引用,找到指针指向内存中的数据 *p = 1000; cout << "a = " << a << endl; cout << "*p = " << *p << endl; system("pause"); return 0; }
7.3 指针所占的内存空间
提问:指针也是种数据类型,那么这种数据类型占用多少内存空间?
回答:
- 在32位操作系统中,占4个字节空间
- 在64位操作系统中,占8个字节空间
示例:
#include<iostream> using namespace std; int main() { //指针所占的内存空间大小? int a = 10; int* p = &a; cout << "sizeof int * = " << sizeof(int*) << endl; cout << "sizeof int * = " << sizeof(p) << endl; system("pause"); return 0; }
7.4 空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
示例1:
#include<iostream> using namespace std; int main() { //空指针 //1、空指针用于给指针变量进行初始化 int* p = NULL; //2、空指针是不可以进行访问的 // 0~255之间的内存编号是系统占用的,因此不可以访问的 //*p = 100; cout << *p << endl; system("pause"); return 0; }
野外指针:指针变量指向非法的内存空间
示例2:
#include<iostream> using namespace std; int main() { //野指针 //在程序中,避免出现野指针 int* p = (int*)0x1100; cout << *p << endl; system("pause"); return 0; }
7.5 const修饰指针
const 修饰指针有三种情况:
- const修饰指针 ---常量指针
- const修饰常量 ---指针常量
- const即修饰指针,又修饰常量
特点:
- 常量指针:
const int* p = &a;
,特点:指针的指向可以修改,但是指针的值不可以修改 - 指针常量:
int* const p = &a;
,特点:指针的指向不可以改,指针指向的值可以改 - 既修饰指针又修饰常量:
const int* const p =&a;
,特点:指针指向,和指针指向的值都不可修改。
示例:
#include<iostream> using namespace std; int main() { //1、const修饰指针 int a = 10; int b = 10; const int* p = &a; //指针指向的值不可以改,指针的指向可以改 //*p =20; //错误操作 p = &b; //正确操作 //2、const修饰常量 int* const p2 = &a; //指针的指向不可以改,指针真相的值可以改 *p2 = 100;//正确操作 //p2 = &b;//错误操作,指针的指向不可以改 //3、const修饰指针和常量 const int* const p2 = &a; //指针的指向和指针指向的值都不可以修改 //*p3 = 10;//错误操作 //p3 = &b;//错误操作 system("pause"); return 0; }
技巧:看const右侧紧跟的是指针还是常量。
7.6 指针和数组
作用:利用指针访问数组中元素
示例:
#include<iostream> using namespace std; int main() { //指针和数组 //利用指针访问数组中的元素 int arr[10] = { 1,2,3,4,5,6,7,8,9,0 }; cout << "第一个元素为:" << arr[0] << endl; int* p = arr; //arr就是数组的首地址 cout << "利用指针访问第一个元素:" << *p << endl; p++;//让指针向后偏移4个字节; cout << "利用指针访问第二个元素:" << *p << endl; cout << "利用指针遍历数组" << endl; int* p2 = arr; for (int i = 0; i < 10; i++) { cout << *p2 << endl; p2++; } system("pause"); return 0; }
7.7 指针和函数
作用:利用指针做函数参数,可以修改实参的值
#include<iostream> using namespace std; //实现两个数字进行交换 void swap01(int a, int b) { int temp = a; a = b; b = temp; cout << "swap01 中 a = " << a << endl; cout << "swap01 中 b = " << b << endl; } void swap02(int* p1, int* p2) { int temp = *p1; *p1 = *p2; *p2 = temp; } int main() { //指针和函数 //1、值传递 int a = 10; int b = 20; swap01(a, b);//值传递不会改变实参 cout << "值传递" << endl; cout << "main 中 a = " << a << endl; cout << "main 中 b = " << b << endl; //2、地址传递 swap02(&a, &b);//地址传递会改变实参 cout << "地址传递" << endl; cout << "main 中 a = " << a << endl; cout << "main 中 b = " << b << endl; system("pause"); return 0; }
7.8 指针、数组、函数
案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排列。
例如:int arr[10] = {4,3,6,9,1,2,10,8,7,5};
示例:
#include <iostream> using namespace std; //冒泡排序函数 //参数1:数组首地址,参数2:数组长度 void bubbleSort(int* arr,int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { //如果j >j+1的值,交换数字 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] << " "; } cout << 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、创建函数,实现冒泡排序 bubbleSort(arr,len); //3、打印排序后的数组 printArray(arr, len); system("pause"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!