字符指针算法C
我正在学习指针算术,我遇到了这样的事情:字符指针算法C,c,char,pointer-arithmetic,C,Char,Pointer Arithmetic,我正在学习指针算术,我遇到了这样的事情: char *str1, *str2; /* stuff in between */ int f = str2 - str1; 什么是str2-str1返回的?比如说str1=“foo”和str2=“foobar”f=str2中的内存地址-str1中的内存地址。 “foo”和“foobar”是指针指向的这些内存位置的值 例如: 如果str2=0x800000A 和str1=0x8000000 str2 - str1 = 0x8000000a - 0x
char *str1, *str2;
/* stuff in between */
int f = str2 - str1;
什么是str2-str1返回的?比如说
str1=“foo”
和str2=“foobar”
f
=str2中的内存地址-str1中的内存地址。
“foo”
和“foobar”
是指针指向的这些内存位置的值
例如:
如果str2=0x800000A
和str1=0x8000000
str2 - str1 = 0x8000000a - 0x80000000
str2 - str1 = 0x0a
已编辑 这个问题的答案取决于具体情况 1) 在您的情况下,由于指针没有指向任何东西,因此结果将是垃圾
2) 如果两个指针指向程序空间中的两个有效内存位置,则结果将是这两个位置之间的内存字节数。尽管这没有任何意义,而且根据C规范,如果两个指针不指向同一个数组或字符串,这是UB。如果两个指针指向同一数组或字符串,则结果将是同一数组中两个元素之间的元素数(当指针指向该数组中的这两个元素时)。检查SO问题以获得示例和更多解释。您提出问题的结果没有定义。要使指针差分正确工作,它们必须来自相同的数组序列(动态、自动,甚至自动VLA都没有区别)。或超过最后一个元素的一个过去地址: §6.5.6加法运算符(第9页) 减去两个指针时,两个指针都应指向同一数组对象的元素,或指向数组对象最后一个元素的一个指针;结果是两个数组元素的下标不同。结果的大小由实现定义,其类型(有符号整数类型)为
标题中定义的ptrdiff\u t
。如果结果不能在该类型的对象中表示,则行为是未定义的。换句话说,如果表达式P
和Q
分别指向数组对象的i-th
和j-th
元素,则表达式(P)-(Q)
的值为i−j如果值适合类型为ptrdiff\u t.
的对象,则如果表达式P
指向数组对象的元素或数组对象最后一个元素的过去一个元素,并且表达式Q
指向同一数组对象的最后一个元素,则表达式((Q)+1)-(P)
与((Q)-(P))+1
和-((P)-(Q)+1))
具有相同的值,并且如果表达式P
指向数组对象最后一个元素之后的一个元素,则其值为零,即使表达式(Q)+1
未指向数组对象的元素。106
也就是说,如果您重新措辞以符合上述规则,则类似于:
#include <stdio.h>
int main()
{
const char *p = "Hello World";
const char *q = p+7;
printf("%td\n", q-p);
return 0;
}
原因从标准的引用部分解释。我想说,只有当两个指针指向同一个“对象”时,这才有效。不一定,例如:
char*str2=&a
,char*str1=&b
那么地址在堆栈上,我上面的答案将具有不同的非连续内存位置。请参阅WhozCraig的答案:(什么是a
和b
,顺便问一下?a
和b
是局部变量。“地址在堆栈上,我上面的答案将有不同的非连续内存位置。”不是由C指定的。甚至“堆栈”也不是由C指定的。结果取决于平台/编译器,因为它是未定义的行为。我想说2)只有当两个指针指向同一个“对象”时才有效结果将是这两个位置之间的内存字节数”是一个常见结果,但未由C规范定义-它是UB。其他结果可能包括程序故障或f
中的无意义值。
7