C 语言内存与指针

65 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

十六进制

内存地址通常使用十六进制(Hexadecimal)来表示。

在生活中,我们常常使用十进制(Decimal)来表示一个数。数字123的转换法则如下:1021+1012+1003=12310^2 * 1 + 10^1*2 + 10^0 * 3 = 123

十六进制数0123456789ABCDEF这些数表示,A - F 对应 10 - 15。

数字123对应的十六进制数为0x7B,转换法则如下:1617+16011(B)=12316^1 * 7 + 16^0 * 11(B) = 123

地址

首先我们定义一个名为n的整型变量,赋值为50

#include <stdio.h>

int main(void)
{
    int n = 50;
    printf("%i\n", n);
}

在计算机的内存中,此时将有 4 个字节存储该数字。

变量n的内存.png

&运算符

在 C 语言中,我们可以通过&运算符来获取一个变量的地址。我们通常在printf函数中使用%p来显示内存地址。

#include <stdio.h>

int main(void)
{
    int n = 50;
    printf("%p\n", &n);
}

运行该程序,我们可以看到类似0x16ee3f2fc的输出。

*运算符

*运算符指「进入」这一个内存地址。我们可以通过*&n来打印出 n 所代表的值。

#include <stdio.h>

int main(void)
{
    int n = 50;
    printf("%i\n", *&n);
}

指针

存储地址的变量称为指针。我们可以使用*运算符来声明一个指针变量。注意,声明指针时所用的类型需要与原数据类型保持一致。

#include <stdio.h>

int main(void)
{
   int n = 50;
   int *p = &n;
   printf("%p\n", p);
}

64 位系统的指针为 8 字节,故在内存中大概长这个样:

指针变量.png

字符串

在 C 语言中,我们通过char *s = "Hi!";来定义字符串。

在内存中,该字符串大概长这样:

字符串内存.png

在 C 语言中,变量存储字符串第一个字符的地址。而\0代表一个字符串的结束。

指针运算

指针运算是指对带有指针的地址进行数学运算。

我们可以通过数组下标来打印字符串的内容:

#include <stdio.h>

int main(void)
{
    char *s = "HI!";
    printf("%c\n", s[0]);
    printf("%c\n", s[1]);
    printf("%c\n", s[2]);
}

当然,也可以通过如下方式显示

#include <stdio.h>

int main(void)
{
    char *s = "HI!";
    printf("%c\n", *s);
    printf("%c\n", *(s+1));
    printf("%c\n", *(s+2));
}