魔法指针 之 指针开篇

简介: 魔法指针 之 指针开篇

指针


概念

C语言中的地址 也形象化叫做 指针,通过它能找到以它为地址的内存单元

so

内存单元的编号 == 地址 == 指针

计算机常见单位转换

常见单位:PB TB GB MB KB byte bit

     由 大------------------>小

1个字节(byte)= 8 bit

1KB = 1024 byte  

1MB = 1024 KB

1GB = 1024 MB    

1TB = 1024 GB

1PB = 1024 TB

深入理解指针

注:地址是用%p来打印的(在vs中是以十六进制打印出来的)

请看代码:

在前面学过,“ & ”该符号叫取地址操作符

int main()
{
  int a = 10;
 
  printf("%d的地址为%p\n", a, &a);
  return 0;
}

%p打印出来的十六进制随机的,取决于计算机

控制台输出

指针变量

一段代码解释清楚指针变量

int main()

{

   int a = 10;

   int* pa = &a; //取出a的地址

        //pa叫做指针变量,也叫做用来存放指针

   return 0;

}

一图 KO 理解指针类型

如上面代码👆

指针变量的大小  

请看代码

注意:%zd是打印类型的

在VS中:

x64环境下8byte  //64位平台

x86环境下4byte  //32位平台

int main()
{
  char* pc = NULL;
  int* pi = NULL;
 
  printf("%zd\n", sizeof(pc));
  printf("%zd\n", sizeof(pi));
 
  return 0;
}

结果会输出什么呢?

再看代码和结果

指针变量的大小和类型是⽆关的,

指针类型的变量,在相同的平台下,大小都是相同的。

实际上,这是vs控制的

我们再来看另一段代码

int main()
{
  int a = 10;
 
  int* pa = &a;
  char* pc = (char*)&a;
 
  printf("%p\n", pa);
  printf("%p\n", pc);
  printf("%p\n", pa+1);
  printf("%p\n", pc + 1);
 
  return 0;
}

看看结果输出

总结

  类型 字节(byte)
char* 1
short* 2
int* 4
float* 4
double* 8

解引用操作符(*)

请看代码:输出a的值是什么呢?

int main()
{
  int a = 6;
 
  int* pa = &a;
  *pa = 10;
 
  printf("%d\n", a);
  return 0;
}

代码解释

const修饰指针

const修饰变量

const修饰指针变量

const放在*左边  vs const放在*右边

const放在*两边


野指针


概念

野指针就是指针指向的位置是不可知的,野指针简称(野狗);

特点

随机的,不确定的,没有明确限制的

最常遇见野指针

指针未初始化

局部变量指针未初始化,默认为随机值

int main()
{
  int *pta;
  *pta = 10;//err
  printf("%d\n", pta);
  return 0;
}

指针越界访问

指针指向的范围超过了数组的范围,越界访问

int main()
{
  int arr[5] = { 0 };
  int* p = &arr[0];
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    *p = 1;
    p++;
  }
  return 0;
}

指针指向的空间释放

举个栗子:

有三个人物:员工A,boss,宾馆,房卡682

boss预定了宾馆,给了员工房卡,让他明天去入住,但在明天前boss退房了,而员工未收到通知,员工去入住了,但在核验时发现房卡用不了

int test()
{
  int a = 10;
  //...
  return &a;
}
 
int main()
{
  int* p = test();
  printf("%d\n", *p);
  return 0;
}
目录
相关文章
|
存储 算法 API
遗传算法解决经典运输问题
欢迎关注我的微信公众号:Python学习杂记
380 0
报错:tk.mybatis.mapper.provider.EmptyProvider中缺少selectOne方法!
报错:tk.mybatis.mapper.provider.EmptyProvider中缺少selectOne方法!
355 0
|
算法 机器人 Linux
Agent-Based概率模型让多无人机野外搜救更高效
【论文解读】Agent-Based概率模型、Receding Horizon规划策略、动态分区算法相结合,提升多无人机野外搜救效果
493 13
Agent-Based概率模型让多无人机野外搜救更高效
|
10月前
|
监控 虚拟化 Docker
Sentinel监测到了服务,但是实时监控不显示曲线图,应该怎么解决这个问题?
在虚拟机(VMware,IP:192.168.175.100)中部署了Sentinel,使用Docker运行,端口映射为8858。服务的`application.properties`配置指向Sentinel仪表盘(192.168.175.100:8858),客户端IP为物理机IP(192.168.2.2)。然而,cart-service在Sentinel中显示失联且无曲线图,而sentinel-dashboard自身监控正常。
|
11月前
|
算法 C++
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
【数据结构——图】最小生成树(头歌实践教学平台习题)目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:【合集】任务描述 本关任务:编写一个程序求图的最小生成树。相关知识 为了完成本关任务,你需要掌握:1.建立邻接矩阵,2.Prim算法。建立邻接矩阵 上述带权无向图对应的二维数组,根据它建立邻接矩阵,如图1建立下列邻接矩阵。注意:INF表示无穷大,表示整数:32767 intA[MAXV][MAXV];Prim算法 普里姆(Prim)算法是一种构造性算法,从候选边中挑
151 10
|
机器学习/深度学习 传感器 人工智能
AI与环境保护:可持续发展的伙伴
在科技日新月异的时代,人工智能(AI)不仅改变了我们的生活和工作方式,还在环保和可持续发展领域发挥重要作用。AI通过环境监测、资源优化、垃圾分类、绿色出行和环保教育等多方面的应用,为环保事业注入新活力,推动社会向更加绿色、可持续的方向发展。
|
Go 计算机视觉
在Golang高并发环境中如何进行协程同步?
在此示例中,使用互斥锁来保护对共享计数器变量 c 的访问,确保并发的 HTTP 请求不会产生数据竞争。
246 3
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
浅谈 Vue3 的模块拆分与 API 重写
浅谈 Vue3 的模块拆分与 API 重写
|
Linux 应用服务中间件 Shell
docker学习--docker容器镜像常用命令大全(简)
本文档详细介绍了Docker中的镜像命令与容器管理命令。镜像命令部分涵盖了镜像搜索、下载、上传等操作;容器管理命令则包括了容器的创建、启动、停止、删除及日志查看等功能。通过具体示例,帮助用户更好地理解和使用Docker相关命令。
849 0

热门文章

最新文章