初识C语言指针:内存,字节划分,地址存储,简单使用,指针大小

简介: 初识C语言指针:内存,字节划分,地址存储,简单使用,指针大小

目录

内存

为什么是划分是一个字节?

地址存储

简单使用

指针变量的大小

总结


内存

当提及指针就不得不提及内存,初识指针,给指针一个通俗的定义:

指针是用来访问内存的

为了有效的使用内存,就把内存分成一个一个小的内存单元,每个内存单元是1个字节。

为什么是划分是一个字节?

      计算机也是有数据所占空间大小的,这有很多单位,例如bit,Byte,KB,MB,GB,TB,PB等,具体运算如下图:

image.gif编辑

       而前面我们所学到了多种数据类型,int long short char......等,它们在创建时就会占用一定的空间,于是根据这些空间发现,定义一比特位显得过小,而定义1KB又显得过大,选择一字节正合适,因此计算机定义,每个内存单元是一字节。

      回到什么是指针这个问题,为了有效的访问到内存的每个单元,把计算机内部的每个内存单元都有一个编号,这些编号被称为是内存单元的地址,而这个地址我们就可以把他理解为指针。

     在计算机上,有地址线,这是物理上的电线,有高低电平的信号,用来转换数字信号(也就是0和1),其中,32位的机器上有32根地址线,每个地址线的代表着1或者0其中的一种,于是32根线就代表着2的32次方种可能结果,而每一种结果占用1个字节,于是总共就是2的32次方字节的空间(每一个都是一一对应的),程序运行起来要加载到内存中,同时也要申请内存空间的使用。

int main()
{
  int a = 15;   //定义int类型的变量
  return 0;
}

image.gif

      这是一个简单的定义int类型的变量,这个过程就是向内存申请了4个字节的存储空间(因为int占用4个字节) ,用来存放15这个数值。


地址存储

在vs编译器中,可以看到a的具体地址:

image.gif编辑

如图,0x后为其所在地址,而0f(十六进制)正代表着的是15。

在C语言中,编号==地址==指针。

那么如何定义指针变量呢?来看这段程序:

#include <stdio.h>
int main()
{
  int a = 15;
  int *pa = &a;
  printf("%p", &a);
  return 0;
}

image.gif

       我们可以看到,在这里有一个*pa的字符出现,pa是存放a地址的一个变量,叫做指针变量,意思是存放指针的变量,而*是在说明pa是个指针变量,int是指pa指向的是int类型的变量。


简单使用

关于指针的最简单使用,可以看如下操作:

#include <stdio.h>
int main()
{
  int num = 10;
  int* p = &num;
  *p = 20;
  printf("%d\n", num);
  printf("%d", *p);
  return 0;
}

image.gif

运行结果如下:

image.gif编辑

这是个很神奇的现象,修改*p的值居然让num的值也改变了?由此引出指针的简单用途:

*p是解引用操作符,其中*p就是通过p找到了num,可以说*p就是num,提供了另外一种途径修改变量:通过修改*p就可以把num修改。  

C语言中有这样一些专有名词需要区分:

指针-----地址-----编号

指针变量-----变量-----存放地址的变量

用图来解释会更清除一些:

image.gif编辑


指针变量的大小

指针变量的大小取决于地址的大小

32位平台下地址是32个bit位(4个字节)

64位平台下地址是64个bit位(8个字节)


总结

      这些是对指针的初步认识,指针的功能远远比这些要多得多,但初步认识指针会对未来更深层次的理解有很大的帮助,需要多加理解。

相关文章
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
426 26
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
531 15
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
922 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
548 6
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
729 1
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
3457 0
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
1161 1