马上就要考试了,有些东西还是不懂,大家能帮帮我吗?
基本上,我们得到了:
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 + 5
是 0x22ff25
?
最佳答案
对于 C 中的任何 typed 指针值,答案都是相同的,并且使用一种称为指针算术 的语言特性。
- 元素类型的字节宽度是多少,如果是结构或 union 类型,包括填充?
- 乘以您正在使用的索引 N
- 添加到数组的基地址。
结果应该是序列中第 N 个元素的地址。请注意,您不能通过 void*
轻松地执行此操作,并且您在执行操作之前对指针执行的任何强制类型转换都会影响结果。
在您的例子中,数组的元素类型是 char *
。假设 sizeof(char*) == 4
然后在你的平台上
- 4 字节
- 4 * 5 = 20 字节 (0x14)
- 0x22ff20 + 0x14 = 0x22ff34
请记住,在上述计算中使用时,数组表示为指向类型的指针,其值为数组基地址。这可能看起来微不足道,但这通常是其中被遗漏的部分。
祝你好运
关于c - C 中的指针,理论方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30063103/