news 2026/4/23 18:17:45

C++初学(指针初阶)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++初学(指针初阶)

1. 内存

内存的概念

在计算机当中,所有的应用程序都将运行在一块特殊的区域,这块区域叫做“内存”。这块“内存”被计算机划分出了不同的区域,比如我们所熟知的:栈、堆等等。

内存很大,我们定义的变量如何标识它在内存当中的位置?计算机给每个“位置”通过“地址”进行定位。

2. 什么是指针变量

指针变量的定义

储存地址的变量

3. 指针类型与访问

3.1 指针类型

定义一个char类型的指针
​ #include<stdio.h> int main() { char c = 'a'; char* pc = &c; return 0; } ​
定义一个short类型的指针
​ #include<stdio.h> int main() { short s = 19; short* ps = &s; return 0; } ​

3.2 指针的访问

指针访问机制

指针的类型决定了指针访问的“能力”。

访问指针所指内存的操作,简称为:解引用操作。使用运算符*进行访问。

访问指针变量所指向内存的值
​ #include<stdio.h> int main() { int a = 10; int* p = &a; printf("%d\n",a);//输出变量a的值 printf("%d\n",*p);//输出指针变量p所指向内存a的值 return 0; } ​

输出结果:
10
10

修改指针变量所指向内存的值
​ #include<stdio.h> int main() { int a = 10; int* p = &a; printf("%d\n", a);//输出变量a的值 printf("%d\n", *p);//输出指针变量p所指向内存a的值 printf("通过指针修改变量内容\n"); *p = 199; printf("%d\n", a);//输出变量a的值 printf("%d\n", *p);//输出指针变量p所指向内存a的值 return 0; } ​

10
10
通过指针修改变量内容
199
199

4. 指针变量的大小

指针大小的决定因素

指针变量当中存储的是地址,存储地址所需的字节数由系统架构和编译环境决定。

  • 32位系统:地址总线宽度为32位(4字节),最大寻址空间为 232 = 4GB
  • 64位系统:地址总线宽度为64位(8字节),理论寻址空间为 264 字节(实际受操作系统限制)

观察下面代码分别在32位编译环境和64位编译环境下输出结果:

​ #include<stdio.h> int main() { printf("%zd\n", sizeof(char*)); printf("%zd\n", sizeof(short*)); printf("%zd\n", sizeof(int*)); printf("%zd\n", sizeof(double*)); return 0; } ​
结论:
  • 32位平台下地址是32个bit位,指针变量大小是4个字节
  • 64位平台下地址是64个bit位,指针变量大小是8个字节
  • 注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的。

5. 指针运算

指针的基本运算有三种,分别是:
  • 指针 +- 整数
  • 指针 - 指针
  • 指针的关系运算

5.1 指针 +- 整数

因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的所有元素。

​ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; ​
#include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &arr[0]; int i = 0; int sz = sizeof(arr)/sizeof(arr[0]); for(i = 0; i < sz; i++) { printf("%d ", *(p + i));//p+i 这里就是指针+整数 } return 0; }

5.2 指针 - 指针

​ #include <stdio.h> int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p1 = &arr[1]; int* p2 = &arr[3]; printf("%d\n",p2-p1); return 0; } ​

要注意相减只能在一个数组里在两个数组地址相减将没有意义,且程序可能会崩溃。

5.3 指针的关系运算

​ #include <stdio.h> int main() { int arr[10] = {1,2,3,4,5,6,7,8,9,10}; int *p = &arr[0]; int sz = sizeof(arr)/sizeof(arr[0]); while(p < arr + sz) //指针的大小比较 { printf("%d ", *p); p++; } return 0; } ​
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 18:16:53

Bili2text:告别手动记录,3步将B站视频秒变文字稿

Bili2text&#xff1a;告别手动记录&#xff0c;3步将B站视频秒变文字稿 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为B站视频的精彩内容无法快速记录…

作者头像 李华
网站建设 2026/4/23 18:14:34

如何严控进度成本,做实项目精细化管理?

项目做着做着就延期、预算算着算着就超支、人力物力投入越来越多&#xff0c;最终项目利润却大打折扣&#xff0c;甚至出现亏损&#xff0c;这是无数企业项目管理中的常态。很多企业明明制定了详细的进度计划、成本预算&#xff0c;可执行过程中完全失控&#xff0c;事后复盘找…

作者头像 李华
网站建设 2026/4/23 18:13:50

掌握15MW海上风电仿真:IEA-15-240-RWT完整实战指南

掌握15MW海上风电仿真&#xff1a;IEA-15-240-RWT完整实战指南 【免费下载链接】IEA-15-240-RWT 15MW reference wind turbine repository developed in conjunction with IEA Wind 项目地址: https://gitcode.com/gh_mirrors/ie/IEA-15-240-RWT IEA-15-240-RWT是全球风…

作者头像 李华