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中任何键入的指针值,答案都是相同的,并且使用了一种称为指针算术的语言功能
void*
进行移植,在执行操作之前对指针执行的任何强制转换都会影响结果
在本例中,数组的元素类型是char*
。假设平台上的sizeof(char*)==4
,则
祝您好运
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*
。感谢您的解释:Dnap
不是指针,它是数组nap+0
是指针,nap
在第一个表达式中作为指针衰减。
0x22ff20 + 4*5 = 0x22ff20 + 0x14 = 0x22ff34