int a = 257; char* p = &a; p++; printf("%d\n", *p); return 0;为什么会输出1,仔细讲解下
时间: 2024-04-17 08:29:24 浏览: 30
这段代码会输出1。让我为您解释一下为什么会这样。
首先,我们声明了一个整型变量a并赋值为257。在内存中,257的二进制表示为00000001 00000001。接着,我们声明一个char指针p,并将其指向变量a的地址。由于指针p是一个char指针,它的大小为1字节。
接下来,我们执行了p++操作,将指针p的值增加了1。这意味着指针p现在指向了a后面的一个字节位置,即存储257二进制表示的低字节的位置。
最后,我们使用printf函数打印指针p当前指向位置的值,即*p。由于该位置存储着257的低字节,其二进制表示为00000001,转换为十进制就是1。
因此,输出结果为1。
相关问题
#include <stdio.h> #include <string.h> #include <stdlib.h> char* reverse(char* s) { int i = strlen(s); int j = i; char* ptr = (char*)malloc(strlen(s) * sizeof(char)); memset(ptr, 0, strlen(s) * sizeof(char)); i--; for (; i >= 0; i--) { ptr[i] = *s; s++; } ptr[j] = '\0'; s = ptr; return s; } void* obfuscate(void* ptr) { int* p = (int*)ptr; *p = (*p ^ 0xdeadbeef) + 0x1337; return ptr; } int main() { char* str = (char*)malloc(200 * sizeof(char)); printf("Enter a string: "); scanf("%s", str); str = (char*)obfuscate((void*)reverse(obfuscate((void*)str)))); printf("Reversed string: %s\n", str); free(str); return 0; } 整理这个代码格式,使其美观容易阅读
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* reverse(char* s) {
int i = strlen(s);
int j = i;
char* ptr = (char*) malloc(strlen(s) * sizeof(char));
memset(ptr, 0, strlen(s) * sizeof(char));
i--;
for (; i >= 0; i--) {
ptr[i] = *s;
s++;
}
ptr[j] = '\0';
s = ptr;
return s;
}
void* obfuscate(void* ptr) {
int* p = (int*) ptr;
*p = (*p ^ 0xdeadbeef) + 0x1337;
return ptr;
}
int main() {
char* str = (char*) malloc(200 * sizeof(char));
printf("Enter a string: ");
scanf("%s", str);
str = (char*) obfuscate((void*) reverse(obfuscate((void*) str)));
printf("Reversed string: %s\n", str);
free(str);
return 0;
}
叙述这段代码的全部过程:int a=0x1234,b=0x5678; char *p1,*p2; printf("%0x %0x\n",a,b); printf("&a=%0x &b=%0x\n",&a,&b); (char *)&a; (char *)&b; printf("&a=%0x &b=%0x\n",&a,&b); p1=&a; p2=&b; printf("%0x %0x\n",*p1,*p2); p1++; p2++; printf("%0x %0x\n",*p1,*p2); return 0;
这段代码的完整过程如下:
1. 声明并初始化整型变量a和b,分别赋值为0x1234和0x5678。
2. 声明字符型指针变量p1和p2。
3. 使用printf函数打印变量a和b的十六进制值。
4. 使用printf函数打印变量a和b的地址。
5. 使用(char *)&a对变量a进行类型强制转换,并且没有将结果赋值给任何变量。这行代码没有实际效果,可以省略。
6. 使用(char *)&b对变量b进行类型强制转换,并且没有将结果赋值给任何变量。这行代码也没有实际效果,可以省略。
7. 使用printf函数再次打印变量a和b的地址。注意,由于前面的强制类型转换没有赋值给任何变量,所以变量a和b的地址没有改变。
8. 将变量a的地址赋值给指针变量p1。
9. 将变量b的地址赋值给指针变量p2。
10. 使用printf函数打印指针p1和p2所指向的值。由于p1指向了a,p2指向了b,所以打印了a和b的十六进制值。
11. 将指针p1向后移动一个字节(char类型的大小),指向了a的下一个字节。
12. 将指针p2向后移动一个字节,指向了b的下一个字节。
13. 使用printf函数再次打印指针p1和p2所指向的值。由于p1和p2都向后移动了一个字节,所以打印了a的下一个字节和b的下一个字节的十六进制值。
14. 返回0,表示程序正常运行结束。