首页 > 其他分享 >指针计算详解

指针计算详解

时间:2023-06-06 21:03:31浏览次数:31  
标签:00 int ptr1 地址 详解 计算 printf cpp 指针

int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1);//&a+1 跳过整个数组后的地址 数组类型转换后存入*ptr
printf("%d\n", *(ptr - 1));//ptr-1 解引用获得的是a[5] 的值

p = (struct test*)0x100000;
printf("struct大小=%d\n", sizeof(*p));//结构体大小是 24
printf("%p\n", p + 0x1);//p+1 跳过整个结构体大小 0x100018(十六进制)
printf("%p\n", (unsigned long)p + 0x1);//将0x100000 强制转换位long整型 +1 就是实际值+1
printf("%p\n", (unsigned int*)p + 0x1);//将p结构体类型强制转换成int*类型,+1 就是跳过四个字节

int* ptr1 = (int*)(&a + 1);//&a+1 跳过整个数组后得到的地址转换成int* 指针存放在 ptr1里
int* ptr2 = (int*)((int)a + 1);//a位首元素地址,转换成int类型一个十六进制的值 再+1
//转换成int* 指针存放入ptr2 此时+1 表示向后移动一个字节
printf("%x,%x\n", ptr1[-1], *ptr2);//ptr1[-1]=*(ptr1 - 1) 此时解引用访问的是a[4] 值为5
//*ptr2 小端存储(01 00 00 00 为a[0], 02 00 00 00 为a[1])解引用
//得到(00 00 00 02) 转换十六进制 0x 02000000

int a[3][2] = { (0,1),(2,3),(4,5) };//逗号表达式的结果为最后一个表达式的结果
int* p;
p = a[0];//a[0]为第一行首元素的地址
printf("%d\n", p[0]);

int aa[2][5] = { 1,2,3,4,5,6,7,8,9,0 };
int* ptr1 = (int*)(&aa + 1);//&aa+1 跳过整个数组后得到的地址转换成int* 指针存放在 ptr1里
int* ptr2 = (int*)(*(aa + 1));//*(aa+1)解引用得到第二行首元素
printf("%d,%d\n", *(ptr1 - 1), *(ptr2 - 1));//*(ptr1-1)得到aa[1][4]=0 *(ptr2-1)得到aa[0][4]= 5

const char* a[] = { "work","at","alibaba" };//a[]里面元素是char* 类型
const char** pa = a;//用*pa 指针去接受数组a的首元素地址,元素类型是char*
pa++;//得到a[1]的地址
printf("%s\n", *pa);//解引用

const char* c[] = { "enter","new","point","first" };
const char** cp[] = { c + 3,c + 2,c + 1,c };
const char*** cpp = cp;

printf("%s\n", **++cpp);//++cpp得到cp[1]的地址 c+2解引用后得到c[2] 解引用打印‘point’
printf("%s\n", *-- * ++cpp+3);//第二次++cpp得到cp[2]的地址 解引用得到c[1]的地址
//——得到c[0] 解引用得到enter +3得到c[0]字符串的第四个字符 打印‘er’
printf("%s\n", *cpp[-2]+3);//此时cpp为cp[2]的地址 cpp[-2]== *(cpp-2)
//得到cp[0]的地址 再解引用得到c[3]字符串 +3得到c[3]字符串的‘st’打印
printf("%s\n", cpp[-1][-1] + 1);//此时cpp为cp[2] cpp[-1][-1]== *(*(cpp-1)-1)
//*(cpp-1)得到 cp[1]解引用后c[2]的地址 再-1得到
//c[1]的地址 解引用得到‘new’ +1 得到‘ew’打印

return 0;
}

标签:00,int,ptr1,地址,详解,计算,printf,cpp,指针
From: https://www.cnblogs.com/zrk-8008/p/17461685.html

相关文章

  • 2023-06-06:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位
    2023-06-06:给你二叉树的根结点root,请你设计算法计算二叉树的垂序遍历序列。对位于(row,col)的每个结点而言,其左右子结点分别位于(row+1,col-1)和(row+1,col+1)树的根结点位于(0,0)。二叉树的垂序遍历从最左边的列开始直到最右边的列结束,按列索引每一......
  • 指针进阶(上)
    前言本章介绍指针进阶上半部分。1、字符指针2、数组指针3、指针数组4、数组传参和指针传参在讲解指针进阶前我们先复习一下,指针的一些基本概念:(1)指针是一个变量,用来存放地址,这个指针唯一标识一块内存空间。(2)指针的大小(所占的空间的大小)固定是4/8个字节,在32/64位环境下会有......
  • Vue——计算属性、监听属性、Vue生命周期、组件介绍和使用、组件间通信、ref属性
    计算属性//1计算属性是基于他们的依赖变量进行缓存的//2计算属性只有在它的相关依赖变量发生改变时才会重新求值,否则不会变(函数只要页面变化,就会重新运算)//3计算属性就像python中的property装饰器,可以把方法/函数伪装成属性//4计算属性,必须有返回值<body><divid......
  • MPP大规模并行计算数据库与分布式数据库的区别
    最近调研分布式TP数据库。结合公司使用的MPP数据库,一度感觉两者很像,随着分布式的深入研究,结合行内MPP数据库使用过正中遇到的问题,简单的总结一下分布式数据库与MPP数据库的区别。分布式数据库系统与并行数据库系统MPPDB有许多相似点,如都有用网络连接各个数据处理结点的特点。网络中......
  • NATS—协议详解(nats-protocol)
    NATS的协议是一个简单的、基于文本的发布/订阅风格的协议。客户端连接到gnatsd(NATS服务器),并与gnatsd进行通信,通信基于普通的TCP/IP套接字,并定义了很小的操作集,换行表示终止。与传统的、使用了二进制消息格式的消息通信系统不同,使用了基于文本的NATS协议,使得客户端实现很简......
  • 透过软考高项上半年真题,看2023下半年考试趋势|上午计算题篇
    2023年上半年软考已经过去了半个多月,想必你对分的兴奋感已经淡去了不少,所以是时候拿出一版有建设性的分析文章出来了(发布早了可能你的兴趣点也不在这上面,哈哈)“建设性”通常是针对未来而言的,对信息系统项目管理师而言,未来并不远,也就5个月之后的事情2023年上半年的考试,特别是高项,是......
  • AQS源码详解
    AQS源码详解可重入锁:同一个线程可重复获取同一把锁对象locksupport:用来创建锁和其他同步类的基本线程阻塞原语park()和unpark()为什么会引出locksupport?像传统的synchorized和lock,他们的wait()和notify()方法,await()和singal()方法使用不方便,必须在同步代码块或者锁内使用,并......
  • 《大学物理实验上》期末笔记(一)不确定度的计算
    《大学物理实验上》期末笔记(一)不确定度的计算什么是不确定度?​ ★不确定度表示测量值可能变动(不能确定)的范围,也是与测量结果相关的一个参数,用于合理表示由于测量误差的存在而对被测量值的不能肯定的程度。​ 简单来说,我们测得一组值,分别为\(x_1,x_2,x_3...x_n\),我们可以通过......
  • python切片详解
    索引的一般方式一个完整的切片是包含三个参数和两个冒号":",用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。切片操作的基本表达式:object[start......
  • 数组名和指针区别(转)
    指针和数组名的共同特点是都是用来指代一个地址的。不同的是:1、指针是需要占用内存空间来存储地址的;数组名则更像是一个立即数或者常数。你可以修改指针指向的内容,但你绝对无法改变数组名的指向。2、数组和指针对于sizeof来说是不同的,指针变量占用的空间通常等于当前CPU的最大......