ano*_*ous 2 c pointers pointer-arithmetic
我无法理解为什么在这个程序2 - 4给出-1,它已经为指针而不是地址分配了int值,我知道但是当我编译它时编译器给出了一些警告,但编译了程序并执行但是...
程序
#include<stdio.h>
int main(void) {
int *p, *q;
int arr[] = {1,2,3,4};
// I know p and q are pointers and address should be assigned to them
// but look at output, why it evaluates (p-q) to -1 while p as 2 and q as 4
p = arr[1];
q = arr[3];
printf("P-Q: %d, P: %d, Q: %d", (p - q), p, q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给
P-Q: -1, P: 2, Q: 4
Run Code Online (Sandbox Code Playgroud)
该重复的问题提到:
指针减法产生相同类型的两个指针之间的数组元素的数量
在Pointer减法混淆中阅读更多相关信息.
但是,您的代码错误且格式错误,因为它会调用未定义的行为.请编译并启用警告,您将获得:
main.c: In function ‘main’:
main.c:12:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
p = arr[1];
^
main.c:13:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
q = arr[3];
^
main.c:15:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
printf("P-Q: %d, P: %d, Q: %d", (p - q), p, q);
^
main.c:15:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ [-Wformat=]
main.c:15:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘int *’ [-Wformat=]
Run Code Online (Sandbox Code Playgroud)
然而,错误将会发生.对于警告,我只是使用了-Wall旗帜.
为了使你的代码有意义,你可以只声明p和q简单的ints而不是指针.
或者,你可以这样做:
p = &arr[1];
q = &arr[3];
printf("P-Q: %td, P: %p, Q: %p", (p - q), (void *)p, (void *)q);
Run Code Online (Sandbox Code Playgroud)
得到这样的东西:
P-Q: -2, P: 0x7ffdd37594d4, Q: 0x7ffdd37594dc
Run Code Online (Sandbox Code Playgroud)
请注意,我用于%td打印指针减法的结果.
严格来说,发生的事情完全取决于您的编译器和平台......但我们假设我们使用的是典型的编译器而忽略了警告.
让我们进一步简化您的问题:
p = 2;
q = 4;
printf("P-Q: %d, P: %d, Q: %d", (p - q), p, q);
Run Code Online (Sandbox Code Playgroud)
这产生了相同的古怪结果:
P-Q: -1, P: 2, Q: 4
Run Code Online (Sandbox Code Playgroud)
正如@gsamaras指出的那样,我们试图减去两个指针.让我们试着看看这可能会导致-1:
p - q = (2 - 4) / sizeof(int)
= (-2) / 4
= -1
Run Code Online (Sandbox Code Playgroud)
我建议尝试一些自己的p和q价值观,看看会发生什么.
不同的例子p和q:
p - q = ??
==========
0 - 0 = 0
0 - 1 = -1
0 - 2 = -1
0 - 3 = -1
0 - 4 = -1
1 - 0 = 0
1 - 1 = 0
1 - 2 = -1
1 - 3 = -1
1 - 4 = -1
2 - 0 = 0
2 - 1 = 0
2 - 2 = 0
2 - 3 = -1
2 - 4 = -1
3 - 0 = 0
3 - 1 = 0
3 - 2 = 0
3 - 3 = 0
3 - 4 = -1
4 - 0 = 1
4 - 1 = 0
4 - 2 = 0
4 - 3 = 0
4 - 4 = 0
Run Code Online (Sandbox Code Playgroud)
生成使用gcc -fpermissive:
#include <stdio.h>
int main() {
printf("p - q = ??\n");
printf("==========\n");
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
int* p = i;
int* q = j;
printf("%d - %d = %2d\n", p, q, (p - q));
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |