C关于指针的那点事

一,场景一

  int arr[4] = {10, 20, 30, 40};

int (*pp)[4] = &arr;

int* p = (int*)(pp + 1);

NSLog(@"%d", *(p-2)); // 结果:30

二,场景二

int arr[4] = {10, 20, 30, 40};

int (*pp)[4] = &arr;

double* p = (double*)(pp + 1);

NSLog(@"%d", *(int*)(p - 2)); // 结果:10

int arr2[2][4] = {

{10, 20, 30, 40},

{11, 21, 31, 41}

};

int (*pp2)[4] = &arr2[1];

NSLog(@"%d", *(int*)pp2); // 结果:11

double* p2 = (double*)pp2;

NSLog(@"%d", *(int*)(p2 + 1)); // 结果:31

int* p2p = (int*)(arr2 + 1);

NSLog(@"%d", *(p2p - 3)); // 结果:20

时间: 2024-10-08 11:13:24

C关于指针的那点事的相关文章

关于指针的那点事

本是漫无目的地游走于图书馆,不知怎么的目光会被一本书给吸引住,<深度理解c指针> 指针简而言之:存放内存地址的变量 以下列出不同内存之中变量的作用域和生命周期   作用域 生命周期 全局内存 整个文件 应用程序的生命周期 静态内存 声明它的函数内部 应用程序的生命周期 自动/静态内存 声明它的函数内部 限制于函数执行时间之内 动态内存 由引用该内存的指针决定 直到内存释放 int * F():-------F返回整数指针的函数 int (*f)();---------f是函数指针

&lt;22&gt;【掌握】指针变量概念及定义方法+【理解】两变量值交换的方法+【掌握】总结*使用场合

[掌握]指针变量概念及定义方法 1.指针变量 用来存放地址的变量,就是指针变量 2.指针? 就是地址,地址是个常量 3.指针变量的定义 数据类型 *指针变量名; int *p; //定义了一个指针变量,变量名是p //int表示,p只能存放一个int类型的变量的地址 char *p1; //定义了一个指针变量,变量名是p1 //p1只能存放一个char类型数变量的地址 int num=10; char *p = &num; //警告 4.指针变量定义的注意事项 1)“*” 必须得有,如果没有就相

完成端口与高性能服务器程序开发

原文出处:http://blog.csdn.NET/roen/archive/2007/03/19/1533378.aspx 以一个文件传输服务端为例,在我的机器上它只起两个线程就可以为很多个客户端同时提供文件下载服务,程序的性能会随机器内CPU个数的增加而线性增长,我 尽可能做到使它清晰易懂,虽然程序很小却用到了NT 5的一些新特性,重叠IO,完成端口以及线程池,基于这种模型的服务端程序应该是NT系统上性能最好的了. 首先.做为完成端口的基础,我们应该理解重叠IO,这需要你已经理解了内核对象及

C++异常处理 - try,catch,throw,finally的用法

写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你习惯使用异常了吗? 现在很多软件都是n*365*24小时运行,软件的健壮性至关重要. 内容导读 本文包括2个大的异常实现概念:C++的标准异常和SHE异常. C++标准异常: 也许你很高兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢? 又或者试想一下一个能解决的错误

C++处理异常 try,catch,throw,finally

异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想过这样做会导致Memory Leak,系统退出,代码重复/难读,垃圾一堆…..吗?现在的软件已经是n*365*24小时的运行了,软件的健壮已经是一个很要考虑的时候了.自序:对写程序来说异常真的是很重要,一个稳健的代码不是靠返回

Core Foundation(CFString为例)

转载 http://limboy.me/ios/2013/06/07/core-foundation.html 先来说说「Core Foundation」(以下简称CF)的历史吧.当年乔布斯被自己创办的公司驱逐后,成立了「NeXT Computer」,其实做的还是老本行:卖电脑,但依旧不景气.好在NeXTSTEP系统表现还不错,亏损不至于太严重.正好此时苹果的市场份额大跌,急需一个新的操作系统,结果大家都知道了,乔布斯借此收购,重新回到了苹果. 这里就牵扯到了一个问题,如何让旧有的系统(Mac

C#面对“重载”的Win 32 函数

在Win32 Api中有很多添加/设置函数在参数上支持多种不同类型的结构体.这些参数定义为LPVOID* 或者LPBYTE,LPVOID*一般由Win32 分配内存空间,在C#从通过System.IntPtr进行遍历[1].LPBYTE空间在函数调用的外部进行分配,之所以定义为LPBYTE,是因为这些结构体可能并不相同——属性.大小不同.那么在C#中如何处理这种LPBYTE接收多种结构体引用的Win32 Api? 先看一个Win 32 API的定义: //The NetUserSetInfo f

Android支付密码输入框

现在很多应用都会集成支付功能,不管是直接调用支付SDK还是自己平台的虚拟货币,支付密码都是很重要的.一般的应用会直接使用Edittext作为密码输入框,这个看着就有点low了,高大上一点的就会自定义一个支付界面,然后输入效果也会有相应的设计,比如我们看到的支付宝和微信支付就是这样的.因为常用所以我也就简单的写了一个类似的支付密码输入控件,望以后不再纠结于此事,哈哈哈,先来张效果图: 控件就是这样的,具体和怎样的支付界面或对话框搭配,就可以灵活使用了. 编程写代码的快慢和Bug的多少都取决于编程思

2017.11.11 复合类型

2.3 复合类型 2.3.1 引用 引用就是为对象起了个别名,引用类型引用另外一种类型.通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名. int ival =1024; int &refVal= ival;          // refVal 指向ival (是ival 的另一个名字) 2.3.2 指针 指针是"指向"另外一种类型的复合类型.与引用不同,第一,指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针生命周期内它可以先后指向几个不同的对象.