int a[3];中a+1与&a+1差别 -- C

int a[3];

a 和 &a 的地址一样的。

a+1 == a + 1*sizeof(int);跳跃是一个数组元素大小

&a+1 == a + 3*sizeof(int);跳跃是整个数组大小

#include <stdio.h>

int
main()
{
	char * a[] = {"hello","the","world"};
	char ** pa = a;
	pa ++;

	/*	获取数组中第二个元素 */
	printf("*pa = %s\n",*pa);
	printf("*(a+1) = %s\n",*(a+1));

	int b[] = {1,2,3};
	int * pb = b;

	/*	获取数组中最后一个元素 */
	printf("*((int *)(&b +1)-1) = %d\n",*((int *)(&b +1)-1));
	printf("*((int *)((&b +1)-1) = %d\n",*((int *)((&b +1)-1)));

	printf("*((char **)(&a+1)-1) = %s\n",*((char **)(&a+1)-1));

	/*	地址一样 */
	printf("b = 0x%0X\n",b);
	printf("&b = 0x%0X\n",&b);
}
/*
[[email protected] test_class]# ./a.out
*pa = the
*(a+1) = the
*((int *)(&b +1)-1) = 3
*((int *)((&b +1)-1) = 1
*((char **)(&a+1)-1) = world
b = 0xBFC556B0
&b = 0xBFC556B0
*/
时间: 2024-10-08 18:27:12

int a[3];中a+1与&amp;a+1差别 -- C的相关文章

int类型数组中找出现几次的数的题目总结

1.     题目1:int类型数组中除了一个数出现一次以外,其他数都出现两次,求该数. [分析]全部异或运算即可. 2.     题目2:int类型数组中除了两个数出现一次以外,其他数都出现两次,求这两个数. 参考:http://zhedahht.blog.163.com/blog/static/2541117420071128950682/ [分析]:全部亦或之后得到的数为resultExclusiveOR,找到它的第一个不是0的位,然后将数组按这个位是否为0分成两组,组内全部亦或即可. /

75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。

[本文链接] http://www.cnblogs.com/hellogiser/p/single-number-of-array-with-other-three-times.html [题目] int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数. [分析] C++ Code 123456789101112   int singleNumber(int *a, int n) {     int ones = 0, twos = 0;     for (int i = 0;

数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用

正如大家所知道的那样: 数组  int a[6] ,  编译器阅读到这句数组定义,会为分配6个int 类型的地址:a[0]  a[1]   a[2]   a[3]  a[4]  a[5].我们 可以正确的使用这6地址内容来存放数据.而本文想说的是a[0]前一个地址和 a[5] 后一个地址的正确使用. 可能有人会有疑问,这两个地址是非法的,是不允许访问和使用的. 幸运的是,我们并不需要引用这两个元素,而只是引用这两个元素的地址,并且着脸个地址在所有C语言实现中都是存在的.ANSIC C 标准明确允

int a[3];中a+1与&amp;a+1区别 -- C

int a[3]; a 和 &a 的地址一样的. a+1 == a + 1*sizeof(int);跳跃是一个数组元素大小 &a+1 == a + 3*sizeof(int);跳跃是整个数组大小 #include <stdio.h> int main() { char * a[] = {"hello","the","world"}; char ** pa = a; pa ++; /* 获取数组中第二个元素 */ pri

[DB][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别

MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. 示例1: 执行SQL:Select * from emp where name = #{employeeName} 参数:employeeName=>Smith 解析后执行的SQL:Select * from emp where n

MyBatis mapper文件中的变量引用方式#{}与${}的差别

MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义.示例1:执行SQL:Select * from emp where name = #{employeeName}参数:employeeName=>Smith解析后执行的SQL:Select * from emp where name

C中的int和OC中的NSInteger区别

在c语言中,int和long的字节数是和操作系统指针所占位数相等. 但c语言中说,long的长度永远大于或等于int objective-c里,苹果的官方文档中总是推荐用NSInteger 它和int有什么区别呢,stackoverflow这帮大神给了答案. 原来在苹果的api实现中,NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型. 定义的代码类似于下: #if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE |

[JSP]JSP中include指令和include动作的差别

include指令是编译阶段的指令,即include所包括的文件的内容是编译的时候插入到JSP文件里,JSP引擎在推断JSP页面未被改动,否则视为已被改动. 因为被包括的文件是在编译时才插入的.因此假设仅仅改动了include文件内容.而没有对JSP改动,得到的结构将不会改变,所以直接运行已经存在的字节码文件.而没有又一次编译.因此对不常常变化的内容,用include指令是合适的,假设须要的内容是常常变化的.则须要动作元素<jsp:include>.以下将具体区分他们之间的不同 1.inclu

Java中String推断相等equals与==的差别以及StringBuilder的equals

Java中String类型具有一个equals的方法能够用于推断两种字符串是否相等,可是这样的相等又与运算符==所推断的"相等"有所不同,接下来进行分析,结论由程序进行验证 String的equals函数仅仅要两个字符串"看起来"相等,就能够返回true,"看起来"相等意思指的是,当两个字符串对象所存放的内容同样时,不须要存放的内存地址同样,可是==推断则仅仅有当推断的两个变量所使用的内存地址为同样时才返回true.比如有两个长得一模一样的双胞胎