c - C 中的指针,理论方面

标签 c

马上就要考试了,有些东西还是不懂,大家能帮帮我吗?

基本上,我们得到了:

char *nap[]= {"Reklamacja","Perspektywa","Reinkarnacja","Hermengilda","Audytorium","Mineralogia","Frustracja"}

那些是波兰语中的一堆单词,但它们根本不重要。 所以继续前进,我们有:

Size of char type on this PC : 1
Size of long type on this PC : 4
Address of beginning nap array (char type): 0x22ff20

Address of R letter in word "Reklamacja": 0x47575d,
Address of P letter in word "Perspektywa": 0x475768,
Address of R letter in word "Reinkarnacja": 0x475774,
Address of H letter in word "Hermengilda": 0x475781,
Address of A letter in word "Audytorium": 0x47578e,
Address of M letter in word "Mineralogia": 0x475799,
Address of F letter in word "Frustracja": 0x4757a5

问题是:下面这行代码的作用是什么?

printf("%#lx", nap+5);

正确答案是:0x22ff34

为什么是这样而不像 0x22ff20 + 50x22ff25

最佳答案

对于 C 中的任何 typed 指针值,答案都是相同的,并且使用一种称为指针算术 的语言特性。

  1. 元素类型的字节宽度是多少,如果是结构或 union 类型,包括填充?
  2. 乘以您正在使用的索引 N
  3. 添加到数组的基地址。

结果应该是序列中第 N 个元素的地址。请注意,您不能通过 void* 轻松地执行此操作,并且您在执行操作之前对指针执行的任何强制类型转换都会影响结果。

在您的例子中,数组的元素类型是 char *。假设 sizeof(char*) == 4 然后在你的平台上

  1. 4 字节
  2. 4 * 5 = 20 字节 (0x14)
  3. 0x22ff20 + 0x14 = 0x22ff34

请记住,在上述计算中使用时,数组表示为指向类型的指针,其值为数组基地址。这可能看起来微不足道,但这通常是其中被遗漏的部分。

祝你好运

关于c - C 中的指针,理论方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30063103/

相关文章:

javascript - 开源钛开发者的源代码藏在哪里?

c - 等待信号

C 中的 Char 数组串联格式

c - 我将代码从 FreeBSD 移植到 Linux,但它没有提取目标地址

c - 这段代码有什么错误?(C - 文件处理)

c++ - 防止使用 glibc 头文件

c - Getopt 订购,有吗?

c++ - 在常量表达式中除以零

c - 如何在 json_tokener_parse() 之后获取 json 值?

c - 制作空白输出文件的程序,C