A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Northcity 中级黑马   /  2015-7-22 00:21  /  1206 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. #include <stdio.h>

  2. int main(int argc, const char * argv[]) {
  3.     int a[3]={1,2,3};
  4.     int *p=(int*)(&a+1);//强制类型转换
  5.     printf("%d\n",*(p-1));
  6.     return 0;
  7. }
复制代码

可能好多人对此有疑问, 大家都知道常量是不能进行取地址& 运算的  比如 &5, 可是既然数组名 a 是一个指针常量,为何可以对a 进行&a呢?
     首先   a == &a == a[0] ,相比大家都是知道的.都等于首元素地址值. 可是   &a+1   a+1  &a[1] 呢?
      &a 取得的时一个行指针,  &a+1 所以跨越一行, 对于一维数组,那就是数组后面的地址.   比如上面代码, 定义一个指针 p, 这里必须使用强制类型转换,把行指针转换为普通指针. 又因为跨越了一行,所以 *(p-1)对应的就是  3:victory:
      

4 个回复

倒序浏览
指针好难
回复 使用道具 举报
这方面知识C语言书上的243页总结的很详细,可以看看C语言书(谭浩强著之第三版)
回复 使用道具 举报
指针常量是用来存放地址的啊,和你说的&5是一个含义么!a是数组名,一维数组的数组名就是指代数组首元素的地址的。
#include <stdio.h>
int main()
{
    int a[3]={1,4,7};
    int *p=a;
    printf("%d\n%d",*p+1,*(p+1));//输出的一个是第一个元素的值再加1,也就是2,输出的第二个是第二个元素的值。
    return 0;
}
感觉你学的太乱了,有点不上道。基础知识一定要扎实,再去看看这一部分知识,可能给你解释你就明白了。
给你附上我自己讲解这一部分的笔记,你自己看看,应该会对你有帮助。
http://blog.csdn.net/felicity294250051/article/details/46989335
12天学好C语言——记录我的C语言学习之路(Day 9) ,你看这一部分试试。
回复 使用道具 举报
学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马