易出错的C语言题目之二:指针
一、写出输出结果
#include<stdio.h> int main(){ int a[3]; a[0] = 0; a[1] = 1; a[2] = 2; int *p,*q; p = a; q = &a[2]; int c = a[q-p]; printf("value c = %d/n",c++); printf("value c = %d/n",c); return 0; }
答案:
value c = 2/nvalue c = 3/n
解析:
此处q-p=2,容易错,地址相减得除以类型,表面上差了8,实际上差了2。不同类型的地址,比如char *p,额int *p,p-q不能操作,报错。
二、写出下列函数运行结果
#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表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5]
三、假如我们的a的地址是:0Xbfe2e100, 而且是32位机,那么这个程序会输出什么?
#include<stdio.h> int main(){ int a[5]; printf("%x\n",a); printf("%x\n",a+1); printf("%x\n",&a); printf("%x\n",&a+1); return 0; }
答案:
0Xbfe2e100
0Xbfe2e104
0Xbfe2e100
0Xbfe2e114
解析:
a表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),因此a+1地址为0Xbfe2e100+sizeof(int) = 0Xbfe2e104;
而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5],因此&a+1地址为0Xbfe2e100 + 5*sizeof(int) = 0Xbfe2e114(十六进制)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决