c语言自学第十二天----深入探究指针中(语句还没学完就先写点指针的)

一.指针+-整数

指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,

cpp 复制代码
#include <stdio.h>
int main()
 {
 int n = 10;
 char *pc = (char*)&n;
 int *pi = &n;
 printf("%p\n", &n);
 printf("%p\n", pc);
 printf("%p\n", pc+1);
 printf("%p\n", pi);
 printf("%p\n", pi+1);
 return  0;
 }

结论:指针的类型决定了指针算法中最小计算单位;

通俗点就是指针的类型决定了指针向前或者向后走一步有多大(距离)。

二.指针的解引用

cpp 复制代码
#include <stdio.h>
 int main()
 {
 int n = 0x11223344;
 char *pc = (char *)&n;
 int *pi = &n;
 *pc = 0;   
*pi = 0;   
r

按f10调试时可以看到两者显示的字节数量不同

结论: 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。

比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

三.指针和数组

先找到一个例子

cpp 复制代码
#include <stdio.h>
 int main()
 {
 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
 printf("%p\n", arr);
 printf("%p\n", &arr[0]);
 return 0;
 }

结果如下

结论:数组名表示的是数组首元素的地址。

所以就可以这么写代码

cpp 复制代码
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
 int *p = arr;

既然可以把数组名当成地址存放到一个指针中,那么显而易见的使用指针来访问一个就成为可能。

cpp 复制代码
#include <stdio.h>
 int main()
 {
 int arr[] = {1,2,3,4,5,6,7,8,9,0};
 int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr)/sizeof(arr[0]);
int i=0
 for(i=0; i<sz; i++)
    {
 printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p+i);
    }
 return 0;
 }

结论:p+i其实计算的是数组 arr 下标为i的地址。
那我们就可以直接通过指针来访问数组。

如:

cpp 复制代码
int main()
 {
 int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 int *p = arr; //指针存放数组首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
 int i = 0;
 for (i = 0; i<sz; i++)
 {
 printf("%d ", *(p + i));
 }
 return 0;
 }
相关推荐
caimouse7 分钟前
ReactOS 图形系统分析(53):系统库存对象 — stockobj.c
c语言·开发语言·spring
ZJU_统一阿萨姆34 分钟前
【推理优化进阶】通信关键路径:NCCL、RDMA 与计算通信重叠
开发语言·人工智能·语言模型·架构·系统架构
我不是疯子是傻子1 小时前
Qt 程序打包部署全攻略:从 windeployqt 到 Inno Setup 的静默安装与版本迭代实战
开发语言·qt
j7~1 小时前
【C语言】《C语言函数递归完全指南:思想、限制、经典例题(阶乘/斐波那契/青蛙跳台阶/汉诺塔)与迭代优化》
c语言·函数递归·汉诺塔问题·青蛙跳台阶问题·递归与迭代·n的阶乘
城管不管2 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
鸿芯微控科技2 小时前
MFC模拟量信号异常怎么排查?0-5V、4-20mA接线与量程换算
c++·5g·mfc·故障排查·质量流量控制器·4-20ma·模拟量信号
霸道流氓气质2 小时前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
三十岁老牛再出发2 小时前
08.18每日总结
c++·python·numpy·pandas
zoujiahui_20182 小时前
Python 包与环境管理工具 uv
开发语言·python·uv
YSL0701243 小时前
动态内存管理
c语言