void main(void){ int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a+1); printf("%d, %d\r\n",*(a+1),*(ptr-1)); }
时间: 2024-04-05 12:19:19 浏览: 60
这段代码的输出结果是:
2, 5
原因是:
- a是一个长度为5的int数组,每个元素占用4个字节的内存空间,所以a占用20个字节的内存空间;
- &a表示a数组的地址,即第一个元素的地址,类型为int(*)[5];
- &a+1表示a数组后面的一个地址,即第6个元素的地址,类型为int(*);
- ptr指向的是& a+1,即第6个元素的地址,也就是a数组后面的4个字节的起始地址;
- *(a+1)表示a数组中下标为1的元素的值,即2;
- *(ptr-1)表示ptr指向的地址的前一个地址所存储的值,即5。
需要注意的是,使用void main是不符合C语言标准的,正确的写法应该是int main(void)。
相关问题
#include <stdio.h>void swap(int *pl, int *p2) { int p; p = pl; pl = p2; p2 = p;}int main() { int a = 5, b = 7, *ptr1, *ptr2; ptr1 = &a; ptr2 = &b; swap(ptr1, ptr2); printf("*ptr1=%d, *ptr2=%d\n", *ptr1, *ptr2); printf("a=%d, b=%d\n", a, b); return 0;}
程序中有一些错误,正确的程序应该是这样的:
```
#include <stdio.h>
void swap(int *pl, int *p2) {
int p;
p = *pl;
*pl = *p2;
*p2 = p;
}
int main() {
int a = 5, b = 7, *ptr1, *ptr2;
ptr1 = &a;
ptr2 = &b;
swap(ptr1, ptr2);
printf("*ptr1=%d, *ptr2=%d\n", *ptr1, *ptr2);
printf("a=%d, b=%d\n", a, b);
return 0;
}
```
程序的运行结果是:
```
*ptr1=7, *ptr2=5
a=5, b=7
```
程序中定义了一个函数 `swap`,它接受两个指向整数的指针作为参数,交换这两个指针所指向的整数的值。
在 `main` 函数中,定义了两个整数变量 `a` 和 `b`,并定义了两个指向整数的指针变量 `ptr1` 和 `ptr2`,分别指向 `a` 和 `b`。
然后调用 `swap` 函数,将 `ptr1` 和 `ptr2` 作为参数传递给它,交换它们所指向的整数的值。
最后输出 `ptr1` 和 `ptr2` 所指向的整数的值,以及 `a` 和 `b` 的值。由于在 `swap` 函数中交换了 `ptr1` 和 `ptr2` 所指向的整数的值,因此输出结果中 `*ptr1` 和 `*ptr2` 的值已经发生了交换,而 `a` 和 `b` 的值没有发生变化。
#include<stdio.h> Void main() { int a[5]={1,2,3,4,5}; int * ptr=(int*)(&a+1); printf(“%d,%d”,*(a+1),*(ptr-1)); }
代码有一些语法错误,应该是:
```
#include <stdio.h>
int main() {
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int*)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
```
这段代码的输出结果是:`2,5`。
解释一下:
- `a` 是一个长度为5的数组,其中 `a[0]` 的地址与 `a` 的地址相同,为 `&a`。
- `&a` 表示整个数组 `a` 的地址,指向数组的指针类型为 `int (*)[5]`。
- `&a + 1` 表示 `&a` 向后偏移一个数组的长度,即 `&a[5]` 的地址,同样是一个指向数组的指针类型 `int (*)[5]`。
- `ptr` 是一个指向整型变量的指针,它指向 `&a[5]` 的地址,但是它的类型是 `int*`,所以需要进行强制类型转换。
- `*(a + 1)` 表示数组 `a` 的第二个元素,即 `a[1]`,它的值为 `2`。
- `*(ptr - 1)` 表示指针 `ptr` 前面的一个整型变量,即 `a[4]`,它的值为 `5`。