一种计算 指针 的方法

适用于地址加1

公式为     X+1 = (unsigned int) X  + sizeof (* X)  其中 X 是个指针

解释:

int a [5] = {1,2,3,4,5};

计算 a+1     和     &a +1

利用公式

a+1 = (unsigned int) a + sizeof(*a) = (unsigned int) a  + sizeof (a[0]) = &a[1] //  a+1 指向 a[1]

&a+1 = (unsigned int) &a + sizeof(* & a) = (unsigned int) a + sizeof (a) = 数组后面的位置//  &a+1 指向数组后面的地址

先搞清楚 X 的含义 ,如 数组名a  带表数组第一个元素的地址  才能得出正确的   *X

int b[2][3] = {{1,2,3},{4,5,6}};

计算 b+1 ,&b +1 ,b[1] +1,&b[1]+1,&b[0]+1

将二维数组看做特殊的 一维数组   int b[2] = {b0,b1};  b0 = {1,2,3}  b1= {4,5,6} 数组名 b 表示 第一个元素的地址 ,即 b0的地址

b+1 = (unsigned int) b +sizeof( *b) = (uint) b + sizeof( b[0]) =b[1] //  b+1 指向  b[1]

&b+1 =(unsigned int) &b + sizeof( * &b) = (uint)&b + sizeof (b) = 数组后面的位置

b[1] +1 = (unsigned int) b[1] + sizeof (* b[1]) = (uint)b[1] + sizeof (b[1][0]) =  &b[1][1]  // b[1] +1 指向 b[1][1]

&b[1]+1 = (unsigned int) &b[1] + sizeof (* &b[1])= (uint)&b[1] + sizeof (b[1]) = 数组后面的位置

&b[0]+1 =  (unsigned int) &b[0] + sizeof (* &b[0])= (uint)&b[0] + sizeof (b[0]) =  &b[1] = &b[1][0]

验证:

#include "stdio.h"

int main()
{
int b[2][3] = {{1,2,3},{4,5,6}};
int (*p1)[] = b+1; //b[1]地址
int *p2 = &b+1; //数组B后面的地址
int *p3 = b[1] +1; //5
int *p4 = &b[1] +1;// 数组B 后面的地址
int *p5 = &b[0]+1;// 4

printf("*p1 = %d\t p1=%d\n",*p1,p1); // P1指向 b[1]     *p1 = b[1] = &b[1][0]
printf("*p2 = %d\t p2=%d\n",*p2,p2);//  p2指向数组外
printf("*p3 = %d\t p3=%d\n",*p3,p3);//  p3 指向b[1][1]  *p3 = 5  p3 = &b[1][1]
printf("*p4 = %d\t p4=%d\n",*p4,p4);//  p4指向数组外
printf("*p5 = %d\t p5=%d\n",*p5,p5);// p5 指向b[1][0]   *p5 = 4  p5 = &b[1][0]

return 0;
}

时间: 2024-08-26 01:01:50

一种计算 指针 的方法的相关文章

一种计算e的方法

原文地址:http://hankjin.blog.163.com/blog/static/3373193720108811316123/ 原理:平均e个(0,1)之间的随机数之和会大于1.原因:n个数之和小于1的概率是1/n!,则n个数之和大于1的概率则是1-1/n!:恰好n个数之后大于1的概率,等于n个数之后大于1的概率减去n-1个数之和大于1的概率,即(1-1/n!) - (1-1/(n-1)!) = (n-1)/n!则n的期望为sum( (n-1)/n! * n ) = sum( (n-1

聊聊JVM(三)两种计算Java对象大小的方法

这篇说说如何计算Java对象大小的方法.之前在聊聊高并发(四)Java对象的表示模型和运行时内存表示 这篇中已经说了Java对象的内存表示模型是Oop-Klass模型. 普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐),按照8的倍数对齐 数组对象结构是 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对

[转]对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的.笔者本次主要是因为预估行高的方法的问题作为了一个契机顺带写了此文对几种动态行高方法的分析. 旧方法 现在常规的动态行高的计算方法还是用 [str boundingRectWithSize:size options:NSStringDrawingU

ios开发日记11 对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的. AD: tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,

对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的.笔者本次主要是因为预估行高的方法的问题作为了一个契机顺带写了此文对几种动态行高方法的分析. 如果你不是在董铂然博客园看到本文,请点击查看原文. 旧方法 现在常规的动态行高的计算方法还是用 [str boundingRectWithSize:siz

结合Scikit-learn介绍几种常用的特征选择方法

作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我们经常不管三七二十一,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的).

干货:结合Scikit-learn介绍几种常用的特征选择方法

原文  http://dataunion.org/14072.html 主题 特征选择 scikit-learn 作者: Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减少特征数量.降维,使模型泛化能力更强,减少过拟合 增强对特征和特征值之间的理解 拿到数据集,一个特征选择方法,往往很难同时完成这两个目的.通常情况下,我

找1~100之间素数的两种比较简单的方法

方法一:利用一个布尔类型的值的判断,优点想法更直接易懂 public static void main(String[] args) { for(int i=2;i<=100;i++){ boolean b=true; for(int n=2;n<i;n++){ if(i%n==0){ b=false; break; } } if(b==true){ System.out.print(i+"\t"); } } } 方法二:能被2和这个数本身以外的数整除的都不是素数.理解难但

数据库中的五种约束及其添加方法

数据库中的五种约束及其添加方法五大约束1.—-主键约束(Primay Key Coustraint) 唯一性,非空性 2.—-唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个 3.—-检查约束 (Check Counstraint) 对该列数据的范围.格式的限制(如:年龄.性别等) 4.—-默认约束 (Default Counstraint) 该数据的默认值 5.—-外键约束 (Foreign Key Counstraint) 需要建立两表间的关系并引用主表的列五大