初识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个字节)


总结

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

相关文章
|
2月前
|
存储 编译器 C语言
C语言存储类详解
在 C 语言中,存储类定义了变量的生命周期、作用域和可见性。主要包括:`auto`(默认存储类,块级作用域),`register`(建议存储在寄存器中,作用域同 `auto`,不可取地址),`static`(生命周期贯穿整个程序,局部静态变量在函数间保持值,全局静态变量限于本文件),`extern`(声明变量在其他文件中定义,允许跨文件访问)。此外,`typedef` 用于定义新数据类型名称,提升代码可读性。 示例代码展示了不同存储类变量的使用方式,通过两次调用 `function()` 函数,观察静态变量 `b` 的变化。合理选择存储类可以优化程序性能和内存使用。
153 82
|
15天前
|
存储 Rust C#
内存指针解引用
【10月更文挑战第14天】
25 1
|
29天前
|
Java API 对象存储
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
36 2
|
1月前
|
存储 安全 NoSQL
driftingblues9 - 溢出ASLR(内存地址随机化机制)
driftingblues9 - 溢出ASLR(内存地址随机化机制)
35 1
|
15天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
15 0
|
29天前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
349 8
|
1月前
|
存储 C语言
C语言中的浮点数存储:深入探讨
C语言中的浮点数存储:深入探讨