数组是数组!指针是指针!它们完全不同!

#include <stdio.h>

  /* book1 程序员面试宝典
   * book2 王道程序员求职宝典
   *
   * 数组和指针的区别与联系:
   *  1. 先要分清,数组是数组,指针是指针,这是两个截然不同的概念
   * 分清概念后,那么以下情形就不难理解:
   * 在test.h中声明extern int *a,但是在test.c中使用ina a[]会编译错误,
   * 因为数组和指针是两个概念,声明了指针却定义数组当然会报错!
   * 2. 数组保存数据,自身即为数据名.而指针保存数据的地址,指向匿名数据
   * 数组名和指针名都是一个地址,而指针值代表这个地址里存储的值
   * 对地址可以进行直接引用,对指针只能进行间接引用
   * 如 char *p1 = "1234";char p2[] = "1234";
   * 假设p1地址为0x1234,p2地址为0x5678,"1234",p1指向字符串常量的地址为0x6666(注意区分两个字符串的地址,是不同的)
   * p1[3]和p2[3]取得的值是一样的,但取得方式却不同
   * p2是通过p2的地址直接增加+3来得到的,0x5678+3
   * 而p1却首先要得到p1地址里的值,即0x6666,然后进行0x6666+3           //详细参见c专家编程 第四章
   *
   * 但数组和指针有以下联系:
   *  除了a被用作运算符sizeof的参数这一情形,
   * 在其他所有的情形中数组名a都代表指向数组a中下标为0的元素的指针.    //from C陷阱和指针 p36
   * int a[3];
   * 所以a的类型是int*, &a的类型是int (*)[3]
   * 又如 int calendar[12][31]
   * calendar[4]的类型是 int(*)[31],&calendar的类型是int (*)[12][31]
   * &calendar[12]等于&*(calendar+12),calendar+12是int (*)[31],解引用后类型为int [31],取址后类型为int (*)[31]
   *
   * 试试看:
   *      以下测试你能做对吗?
   */
  int main(){


  }

  void test1(){
      //book2 p15 Q3
      int a[] = {1,2,3,4,5};
      int *ptr = (int*)(&a+1);
      printf("%d\n", *(ptr-1));
  }

  void test2(){
      //book2 p15 Q4
      int a[2][2][3] = { { {1,2,3}, {4,5,6} }, { {7,8,9}, {10,11,12} } };
      int *ptr = (int *)(&a+1);
      printf("%d, %d\n",*(int*)(a+1), *(ptr-1));
  }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值