C中的指针,理论方面

时间:2015-05-05 20:56:10

标签: 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 + 5 0x22ff25

3 个答案:

答案 0 :(得分:6)

对于C中的任何 类型指针值,答案是相同的,并使用名为指针算法的语言功能。

  1. 元素类型的字节宽度是多少,包括结构或联合类型的填充?
  2. 乘以指数N,您正在使用
  3. 添加到阵列的基地址。
  4. 结果应该是序列中第N个元素的地址。请注意,您无法使用void*进行此操作,并且您在执行操作之前指针上执行的任何强制转换都会影响结果。

    在您的情况下,数组的元素类型为char *。假设您的平台上有sizeof(char*) == 4

    1. 4字节
    2. 4 * 5 = 20字节(0x14)
    3. 0x22ff20 + 0x14 = 0x22ff34
    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