为什么两个同类型的指针不可以相加但是可以相减?而且两个相同类型的指针为什么可以进行比较?
指针变量的值是它指向的变量的地址;
相加的话,就不确定指向哪里了,这既没有实际意义,编译器也不允许这样。
而相减,通常用来计算同一数组中两个元素的距离,这是有实际意义的。
如果两个指针指向相同类型的对象,则可以比较两个指针的值,比如判断2个指针是否指向同一个对象。
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
回答:
指针在 C/C++ 中是一个非常重要的概念,指针可以用来访问内存中的数据,所以指针在编程中的应用非常广泛。在 C/C++ 中,指针运算是一种特殊的运算,它不同于其他算术运算,主要体现在两个方面:一是指针相加操作是不被允许的,但是指针相减是被允许的;二是相同类型的指针可以进行比较。
为什么不允许两个指针相加呢?
指针在 C/C++ 中的作用是指向内存中的数据,它们通常被称为“地址”。每个地址处都有一个对应的数据类型。例如,如果有一个 int 类型的变量,那么它会占用四个字节的内存空间,所以它的地址就是一个指向四个字节的内存空间的指针。C/C++ 中的指针加法是按照数据类型来进行计算的,即将指针加上 n 个某种类型的变量所占据的字节数,就可以访问内存中距离该地址 n 个某种类型变量所占据的字节数的位置。但是,在 C/C++ 中,两个指针相加所得到的结果并不能确定一个地址,因为在两个指针之间可能存在不可访问的内存空间。
为什么允许两个指针相减呢?
指针相减所得到的结果是两个指针之间地址的距离,这个距离的单位是根据指针类型的大小来确定的。例如,如果是 char* 类型的指针相减,那么结果就是两个指针之间的字节数。可以使用指针相减来计算数组元素之间的偏移量,或者计算一个指针指向的内存块的大小。
为什么相同类型的指针可以进行比较呢?
在 C/C++ 中,相同类型的指针可以进行比较,比较操作是比较指针所指向的内存地址的大小。指针所指向的内存地址是唯一的,每个地址都可以对应到内存中的一个具体位置,所以比较两个指针所指向的地址大小是有意义的。
指针运算的实现和规则
指针从本质上来讲是一种特殊的数据类型,它存储的是内存地址,由于内存地址是连续的,所以指针可以使用加法和减法进行运算。指针的加法运算实际上是根据所指向的数据类型的大小来计算的,例如,如果一个指针 p 指向 char 类型的数据,那么 p+1 就是指向 p 所指向的 char 变量后面紧挨着的 char 变量。
指针的比较运算实际上是比较它们所指向的内存地址的大小,如果一个指针所指向的内存地址比另一个指针所指向的内存地址大,那么它们之间的差值就是正数,反之则为负数。如果两个指针所指向的内存地址相同,那么它们之间的差值为 0。
需要注意的一点是,在进行指针运算之前,必须要确保该指针指向的内存空间是有效的,否则就会出现未定义行为。此外,在进行指针加减运算时,还要注意指针指向的数据类型的大小,以免出现错误的偏移量。
参考资料:
无。