我很快就有编程考试了,我仍然无法理解某些事情,你们可以帮助我吗?
基本上,我们得到了:
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
?
答案 0 :(得分:6)
对于C中的任何 类型指针值,答案是相同的,并使用名为指针算法的语言功能。
结果应该是序列中第N个元素的地址。请注意,您无法使用void*
进行此操作,并且您在执行操作之前指针上执行的任何强制转换都会影响结果。
在您的情况下,数组的元素类型为char *
。假设您的平台上有sizeof(char*) == 4
请记住,当在上面的计算中使用时,数组表示为指向类型的指针,其值为数组base-address。这可能看似微不足道,但这通常是错过的部分。
祝你好运
答案 1 :(得分:1)
您的nap
变量被声明为指向字符串数组的指针。因此,当您使用nap+5
时,您实际上是将指针5个元素向下移动到数组(将指向Mineralogia
)。为了检索您期望的结果,您必须转换指针使其指向第一个字符串,然后向其添加5以将指针向下移动5个字符。这是我编写的一个测试应用程序来演示这个(我的代码通常解释得比我口头上说的好):
#include <stdio.h>
int main()
{
char* nap[] = {"Reklamacja","Perspektywa","Reinkarnacja","Hermengilda","Audytorium","Mineralogia","Frustracja"};
//Returns the beginning address of nap
printf("%#lx\r\n", nap);
//Returns the sixth string in nap (aka nap[5] since arrays are 0-based index)
//and the address
printf("%s %#lx\r\n", *(nap+5), nap+5);
//Returns the first string in the array (aka nap[0]) and the address
printf("%s %#lx\r\n", *nap, *nap);
//Returns the 1st string in the array starting at the 6th letter and the address
printf("%s %#lx\r\n", *nap+5, *nap+5);
return 0;
}
还记得char
是4个字节,所以最后一个printf
语句将指针向下移动了20个字节。
答案 2 :(得分:1)
nap
是指向数组中第一项的指针:nap == &(nap[0])
。
nap+5
是指向数组第六项的指针:nap+5 == &(nap[5])
。
数组的每个项目长度为4个字节(测试sizeof(char *)
),因此nap+5
的数值是nap
的数值加上5倍4:
0x22ff20 + 4*5 = 0x22ff20 + 0x14 = 0x22ff34