黑马程序员技术交流社区

标题: 关于&a &a+1 a a+1 &a[0] [打印本页]

作者: Northcity    时间: 2015-7-22 00:21
标题: 关于&a &a+1 a a+1 &a[0]
  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:
      

作者: qq103613    时间: 2015-7-22 00:27
指针好难
作者: 562413895@qq.co    时间: 2015-7-22 09:23
这方面知识C语言书上的243页总结的很详细,可以看看C语言书(谭浩强著之第三版)
作者: 294250051    时间: 2015-7-22 09:51
指针常量是用来存放地址的啊,和你说的&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) ,你看这一部分试试。
作者: Foreversidy夏末    时间: 2015-7-22 12:53
学习一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2