Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的指针,理论方面_C - Fatal编程技术网

C语言中的指针,理论方面

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

我马上就要参加程序设计考试了,但有些事情我还是不懂,你们能帮我吗

基本上,我们得到:

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

您的
nap
变量被声明为指向字符串数组的指针。因此,当您使用
nap+5
时,实际上是在将指针5元素向下移动数组(它将指向
Mineralogia
)。为了检索您期望的结果,您必须强制转换指针,使其指向第一个字符串,然后向其添加5以将指针向下移动5个字符。下面是我编写的一个测试应用程序来演示这一点(我的代码通常比我口头上说的lol解释得更好):

#包括
int main()
{
char*nap[]={“Reklamacja”、“Perspektywa”、“Reinkarnacja”、“Hermengilda”、“Audytorium”、“矿物学”、“Frustracja”};
//返回nap的起始地址
printf(“%#lx\r\n”,nap);
//返回nap中的第六个字符串(也称为nap[5],因为数组是基于0的索引)
//地址呢
printf(“%s%#lx\r\n”*(nap+5),nap+5);
//返回数组中的第一个字符串(也称为nap[0])和地址
printf(“%s%#lx\r\n”、*nap、*nap);
//返回数组中从第6个字母和地址开始的第一个字符串
printf(“%s%#lx\r\n”、*nap+5、*nap+5);
返回0;
}

还要记住,
char
是4个字节,因此最后一个
printf
语句将指针沿字符串向下移动了20个字节。

对于C中任何键入的指针值,答案都是相同的,并且使用了一种称为指针算术的语言功能

  • 元素类型的字节宽度是多少,包括填充(如果是结构或联合类型)
  • 乘以你正在使用的索引N
  • 添加到数组的基址
  • 结果应该是序列中第N个元素的地址。注意:您不能使用
    void*
    进行移植,在执行操作之前对指针执行的任何强制转换都会影响结果

    在本例中,数组的元素类型是
    char*
    。假设平台上的
    sizeof(char*)==4
    ,则

  • 4字节
  • 4*5=20字节(0x14)
  • 0x22ff20+0x14=0x22ff34
  • 请记住,当在上述计算中使用数组基址值时,数组表示为指向类型的指针。这可能看起来很琐碎,但这是经常被忽略的部分


    祝您好运

    nap
    是指向数组第一项的指针:
    nap==&(nap[0])

    nap+5
    是指向数组第六项的指针:
    nap+5==&(nap[5])

    数组的每个项都有4个字节长(测试
    sizeof(char*)
    ),因此
    nap+5
    的数值是
    nap
    的数值加上5乘以4:

    0x22ff20 + 4*5 = 0x22ff20 + 0x14 = 0x22ff34
    

    事实上,就语言标准而言,它有未定义的行为
    “%#lx”
    需要类型为
    无符号长
    的参数;实际参数是指针。打印指针值的正确方法是
    printf(“%p”((void*)(nap+5))。这个问题对指针是如何表示的以及
    printf
    是如何工作的做出了一些假设。这些假设在您的系统上可能有效,但不能保证。(size_t)nap+5*sizeof(char*)
    char*nap[]
    声明一个char指针数组,因此
    0x22ff34=0x22ff20+5*sizeof(char*)
    (在本例中为4字节*5)@Alex:你说得对。我删除了注释。实际上
    sizeof(char*)
    –计算是用数组元素的大小完成的,即
    char*
    。感谢您的解释:D
    nap
    不是指针,它是数组
    nap+0
    是指针,
    nap
    在第一个表达式中作为指针衰减。
    0x22ff20 + 4*5 = 0x22ff20 + 0x14 = 0x22ff34