分析以下程序,输出结果 2,5

#include<stdio.h>
int main() {
int a[]={,,,,};
int *ptr=(int *)(&a+);
printf("%d,%d",*(a+),*(ptr-));
return ;
}

分析:

a 代表的是int * 每次步长为一个int;

&a 代表的是 int[]* 每次步长为所指向的数组的大小。(&a是数组指针,其类型是int(*)[5])

ptr 指向的是数组a最后一个元素的下一个元素

所以ptr-1指向的是数组a的最后一个元素

*(a+1)指向的是数组a的第二个元素,等价于a[1]。

补充:对数组名取地址,&a,得到的是整个数组的首地址,是与数组首元素的地址是相等的,但是意义不同。

所以(a+1)是将地址值加4(一个int占4个字节大小),而&a+1是将地址值加20(数组大小为4字节*5个int类型的数字)。

注意:int *p=(int *)&a+1; 与 int *ptr=(int *)(&a+1);是不同的。

#include<stdio.h>
int main() {
int a[]={,,,,};
int *ptr=(int *)(&a+);
printf("%d,%d",*(a+),*(ptr-));
int *p=(int *)&a+;
printf("\n%d",*p);
return ;
}

15 int *ptr= (int *)(&a+1)跨了整个数组长度的更多相关文章

  1. int *ptr=(int *)(&a+1)问题的探讨

    从网络上看到这样一道有意思的题目,是关于数组与指针的问题,描述如下: main() { ]={,,,,}; ); printf(),*(ptr-)); } 输出为:2,5 请解释以上代码的输出结果. ...

  2. int *const && int const * && const int *的区别

    ANSIC允许声明常量,常量和变量不同,常量就是不可以改变的量,用关键字const来修饰 比如:const int a int const a 以上两种声明方式是一样的,我们不需要考虑const和in ...

  3. 实现pow(int x, int y),即x的y次方 ; 异或交换两个数;

    问题1:实现pow(int x, int y) ,即x的y次方 x的y次方就是有y个x连续乘机,代码如下: #include <stdio.h> #include <stdlib.h ...

  4. 深入解剖unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...

  5. signal函数:void (*signal(int,void(*)(int)))(int);

    http://blog.chinaunix.net/uid-20178794-id-1972862.html signal函数:void (*signal(int,void(*)(int)))(int ...

  6. unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...

  7. int main( int argc, char **argv)

    1.参数 (有时参数是void) argc是程序运行时参数个数 argv是存储参数的数组,可以用char* argv[],也可以用char **argv. 例如编译一个hello.c的程序 1 #in ...

  8. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...

  9. int(*f)(int)

    int(*f)(int): 为指向函数的指针变量的定义方法,其中f为指向函数的指针变量,第一个int为函数返回值类型,第二个int为函数的形参类型.

随机推荐

  1. STM32串口中断

    在打开串口1中断后 待机唤醒功能,(PA0唤醒)等 系统挺运行问题? ??(2014.11.13)

  2. TCP 的连接建立:采用三报文握手

  3. List集合实现简易学生管理

    题目: 代码: package org.wlgzs; import java.util.ArrayList; import java.util.List; import java.util.Scann ...

  4. 误把Linux运行级别设置为6后的解决方法【转】

    本文转载自:http://www.wuji8.com/meta/841011126.html 误把Linux运行级别设置为6后的解决方法     我们知道,Linux有7个运行级别,而运行级别设置为6 ...

  5. openwrt如何单独编译uboot

    答:make package/boot/uboot-<chip series>/compile

  6. HDU1143 (递推)题解

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  7. 51nod 1020 逆序排列 递推DP

    1020 逆序排列  基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...

  8. php跨域

    <?php header('Content-type:text/html; charset="utf-8"'); $url = 'http://10.32.41.194:80 ...

  9. HDU 2546 饭卡(0-1背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=2546 题意: 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金 ...

  10. C# string[]转List<string>

    List<string> ltProduct = new List<string>(Product.Split('|'));