携手创作,共同成长!这是我参与「掘金日新计划 · 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));
}