携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
十六进制
内存地址通常使用十六进制(Hexadecimal)来表示。
在生活中,我们常常使用十进制(Decimal)来表示一个数。数字123
的转换法则如下:。
十六进制数由0
、1
、2
、3
、4
、5
、6
、7
、8
、9
、A
、B
、C
、D
、E
、F
这些数表示,A - F 对应 10 - 15。
数字123
对应的十六进制数为0x7B
,转换法则如下:。
地址
首先我们定义一个名为n
的整型变量,赋值为50
。
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%i\n", n);
}
在计算机的内存中,此时将有 4 个字节存储该数字。
&
运算符
在 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 字节,故在内存中大概长这个样:
字符串
在 C 语言中,我们通过char *s = "Hi!";
来定义字符串。
在内存中,该字符串大概长这样:
在 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));
}