当前位置: 首页 > news >正文

指针 (下 -完结)

目录

一、字符数组

二、指针运算

1.

2.

3.

4.

5.

6.

7.

一、字符数组

char arr[] = "abcdef"; printf("%zd\n",sizeof(arr)); //单独放在sizoef内,计算的是整个数组的大小,为7个字节 printf("%zd\n",sizeof(arr + 0)); //arr表示首元素地址,arr+0还是首元素地址,为4/8字节 printf("%zd\n",sizeof(*arr)); //arr表示首元素地址,解引用后是首元素,为1个字节 printf("%zd\n",sizeof(arr[1])); //为数组的第二个元素,计算第二个元素的大小,为1个字节 printf("%zd\n",sizeof(&arr)); //arr单独与&出现,代表整个数组的地址,是地址就为4/8字节 printf("%zd\n",sizeof(&arr + 1)); //跳过1个数组后的地址,但还是地址,为4/8 printf("%zd\n",sizeof(&arr[0] + 1)); //&arr[0]是首元素地址,&arr[0]+1是数组第二个元素的地址,为4/8字节
7 8 1 1 8 8 8
char arr[] = "adcdef" printf("%zd\n",strlen(arr)); //arr首元素地址,从第一个元素开始往后找\0,统计\0之前的字符个数 printf("%zd\n",strlen(arr + 0)); //arr+0还是首元素地址,同上 //printf("%zd\n",strlen(*arr)); arr是首元素地址,解引用后得到首元素,ASCLL码为97,可能会作为地址非法访问内存,导致程序崩溃 //printf("%zd\n",strlen(arr[1])); 是第二个元素,道理同上 printf("%zd\n",strlen(&arr)); //&arr是数组的地址,但也是从首元素地址开始往后找\0,统计\0之前的字符个数 printf("%zd\n",strlen(&arr + 1)); //跳过一个数组后的地址往后找\0,随机值 printf("%zd\n",strlen(&arr[0] + 1)); //第二个元素的地址,为5个字符
6 6 6 26 5
const char * p = "abcdef"; printf("%zd\n",sizoef(p)); //p是指针变量,为4/8 printf("%zd\n",sizoef(p+1)); //p+1是'b'的地址,为4/8 printf("%zd\n",sizoef(*p)); //*p == 'a' printf("%zd\n",sizeof(p[0])); //'a' printf("%zd\n",sizoef(&p)); //是指针变量p的地址,为4/8 printf("%zd\n",sizoef(&p+1)); //跳过一个字符串长度后的地址,为4/8 printf("%zd\n",sizeof(&p[0]+1)); //是'b'的地址,为4/8
8 8 1 1 8 8 8
char * p = "abcedf"; printf("%zd\n",strlen(p)); //6 p是'a'的地址 printf("%zd\n",strlen(p + 1)); //5 是'b'的地址 //printf("%zd\n",strlen(*p)); //非法访问 //printf("%zd\n",strlen(p[0])); //非法访问 printf("%zd\n",strlen(&p)); //指针变量的地址开始往后找\0,随机值 printf("%zd\n",strlen(&p + 1)); //随机值 printf("%zd\n",strlen(&p[0] + 1)); //5
6 5 6 30 5
int a[3][4] = {0}; printf("%zd\n",sizoef(a)); //48 printf("%zd\n",sizeof(a[0][0])); //4 a[0][0]是第一行第一个元素 printf("%zd\n",strlen(a[0])); //16 a[0]是第一行一维数组的数组名,单独放在sizoef内,计算的是第一行这个一位数组的大小 printf("%zd\n",sizeof(a[0]+1)); //4/8 是第一行第二个元素的地址 printf("%zd\n",sizoef(*(a[0]+1))); //4 第一行第二个元素 printf("%zd\n",sizoef(a+1)); //4/8 第二行的一维数组的地址 printf("%zd\n",sizeof(*(a+1))); //16 访问第二行的一维数组 printf("%zd\n",sizoef(&a[0]+1)); //4/8 第二行一维数组的地址 printf("%zd\n",sizoef(*(a[0]+1))); //4 第二行的第一个元素 printf("%zd\n",sizeof(*a)); //16 访问第一行的一维数组 printf("%zd\n",sizoef(a[3])); //16 没有越界访问,sizeof内部表达式不计算
48 4 16 8 4 8 16 8 16 16 16

二、指针运算

1.

int a[5] = {1,2,3,4,5}; int * ptr = (int*)(&a+1); //向前跳过一个数组长度后的地址 printf("%d,%d\n",*(a+1),*(ptr-1)); return 0;
2,5

2.

struct test { int num; char * pcname; short sdata; char ch[2]; short sba[4]; }*p = (sturct test *)0x100000; int main() { printf("%p\n",p + 0x1); printf("%p\n",(unsigned long)p + 0x1); //对于整数加1就是加1 printf("%p\n",(unsigned int *)p + 0x1); //无符号整型指针加1,跳过一个类型后的指针 return 0; }
00100014 00100001 00100004

3.

int a[3][2] = {(0,1),(2,3),(4,5)}; int * p; p = a[0]; printf("%d",p[0]); //注意这里是()而不是 {},逗号表达式的值,是最后一个表达式的值,即{1,3,5} return 0;
0

4.

int a[5][5]; int(*p)[4]; p = a; printf("%d,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]); //注意根据指针类型来决定访问空间大小的跨度

指针-指针的前提是两个指针指向同一块空间

指针-指针得到的结果的绝对值是两个指针之间的元素个数

小地址 - 大地址 会得到负数

fffffffc -4

5.

int aa[2][5] = {1,2,3,4,5,6,7,8,9,10}; int * p1 = (int *)(&aa + 1); int * p2 = (int *)(*(aa + 1)); printf("%d,&d",*(ptr - 1),*(ptr2 - 1));
10,5

6.

char * a[] = {"work","at","alibaba"}; char ** pa = a; pa ++; printf("%s\n",*pa);
at

7.

char * c[] = {"ENTER","NEW","POINT","FIRST"}; char ** cp[] = {c + 3, c + 2, c + 1,c}; char *** cpp = cp; printf("%s\n",**++cpp); printf("%s\n",*--*++cpp + 3); printf("%s\n",*cpp[-2] + 3); printf("%s\n",cpp[-1][-1] + 1);

POINT ER ST EW

http://www.jsqmd.com/news/649109/

相关文章:

  • jQuery Mobile 按钮图标
  • FreeRTOS配置实战:从宏定义到内存优化的系统裁剪指南
  • 终极指南:使用ide-eval-resetter轻松重置JetBrains IDE试用期,实现开发自由
  • 044、代码实战九:在简单文本数据集上训练Diffusion-LM
  • Qwen3.5-9B助力Visual Studio开发:C++项目调试与智能辅助
  • 深入解析Node.js事件循环机制
  • 5分钟掌握Hitboxer:终极SOCD键盘重映射工具完全指南
  • 构建弹性数据中心供应链的5个技巧
  • MySQL主从复制详细过程和总结
  • 3步解决Zotero中文文献管理难题:Jasminum插件完整指南
  • XUnity自动翻译器终极指南:5分钟快速实现Unity游戏汉化,告别语言障碍
  • 人脸识别OOD模型在交通管理中的应用
  • 面向生产环境:实时手机检测-通用API封装+批量图片检测脚本示例
  • stm32C8T6(ME6211稳压芯片),电容电阻换算,启动电路
  • Unity资源编辑革命:跨平台工具UABEA的颠覆性应用指南
  • Phi-4-mini-reasoning辅助Anaconda环境管理:依赖冲突的智能解决建议
  • 终极解决方案:5分钟让微信网页版重新工作!免费开源插件完全指南
  • 【Linux】linux基础IO(c语言程序接口,常用文件调用详解)
  • 如何通过Jasminum插件提升中文文献管理效率80%:完整操作指南
  • openEuler(CentOS8)防火墙firewall与Selinux实战配置指南
  • mac上如何安装openclaw,并在微信中使用clawbot
  • 终极视频PPT提取指南:三分钟实现智能自动化处理
  • HeteroFlow v2 企业版:统一异构算力调度,让国产 GPU 物尽其用!
  • 二维核密度估计实战:用Seaborn的kdeplot函数,从数据探索到模型诊断
  • FogGate-YOLO:直击雾天检测痛点,基于通道选择的 YOLOv8 优化方案
  • 北京正规上门回收名家字画、明清古籍等藏品 6家靠谱机构汇总 - 品牌排行榜单
  • Z-Image-Turbo保姆级部署教程:开箱即用,无需下载模型,小白也能搞定
  • 多模态长尾问题正在吞噬你的模型ROI!:2023–2024全球117个落地项目统计——长尾处理滞后导致平均交付延期22.6天,成本超支31%
  • 消息队列系统的消息持久化顺序保证与消费确认
  • 从CTF实战出发:手把手教你用Python脚本破解RSA共模攻击(附完整代码)