#include <stdio.h> int main() { char *p="abcdefgh",*r; long *q; q=(long*)p; q++; r=(char*)q; printf("%s\n",r); return 0; } 为什么输出的是efgh
时间: 2024-04-13 12:25:26 浏览: 166
这段代码的输出为 "efgh" 是因为在进行类型转换时,将字符指针 `p` 强制转换为了长整型指针 `q`。在大多数系统中,一个长整型占用 4 个字节(32 位),而字符指针占用 1 个字节。
在代码中,`q++` 将指针 `q` 向后移动了 4 个字节,因为一个长整型占用了 4 个字节的内存空间。接着,将指针 `q` 强制转换回字符指针 `r`。由于 `q++` 后移了 4 个字节,所以 `r` 指向了原字符串 "abcdefgh" 的第五个字符 "e",然后通过 `printf()` 函数打印出了从 "e" 开始的字符串 "efgh"。
相关问题
#include <stdio.h> #include <string.h> void strrev(char *p,char *q) { while(p<q) { int t=*p;*p=*q;*q=t; p++;q--; } } int main(int argc, const char *argv[]) { char str[]="good good study"; char *p=str; char *q=str+strlen(str)-1; strrev(p,q); p=q=str; while(*p!='\0') { while(*q!=' '&&*q!='\0') { q++; } char *k=q-1; strrev(p,k); while(*q==' ') q++; q=p; } puts(str); return 0; }
这段代码是用来颠倒字符串中每个单词的序的。它首先定义了一个函数`strrev`,用于颠倒字符串中给定区间的字符顺序然后在`main`函数中,它将字符串"good good study"储在字符数组`str`中。接着它使用指针`p`和`q`分别指向字符串的开头和结尾。
然后,它调用`strrev函数来颠倒整个字符串。接下来,它使用两个指针`p`和`q`来遍历字符串,找到每个单词的起始和结束位置,并调用`strrev`函数来颠倒每个单词的字符顺序。最后,它打印出颠倒后的字符串。
这段代码的输出结果应该是"doog doog yduts",也就是将原字符串中每个单词的顺序颠倒了。
以下程序可以逐行输出由language数组元素所指向的5个字符串。 #include<stdio.h> int main(void) { const char *language[] = {"BASIC", "FORTRAN", "PROLOG", "JAVA", "C++" } ; const char ; int k; for(k = 0 ; k < 5 ; k++) { ; printf ("%s\n", *q); } return 0; }
以下是可以逐行输出由language数组元素所指向的5个字符串的程序:
```
#include <stdio.h>
int main(void) {
const char *language[] = {"BASIC", "FORTRAN", "PROLOG", "JAVA", "C++"};
const char *q;
int k;
for (k = 0; k < 5; k++) {
q = language[k];
printf("%s\n", q);
}
return 0;
}
```
程序中,`const char *q;` 声明了一个指向常量字符串的指针变量 q。在 for 循环中,`q = language[k];` 将 q 指向 language 数组中第 k 个元素所指向的字符串。然后,`printf ("%s\n", *q);` 可以输出 q 指向的字符串。最终,程序可以逐行输出由 language 数组元素所指向的 5 个字符串。
阅读全文