一个题目引发的数组和指针复习

目录

题目

 解题思路

数组复习实践

指针复习实践


题目

  int a[2][2][3] = {{{1, 2, 3}, {4, 5, 6}}, {{7, 8, 9}, {10, 11, 12}}};
 
  int *ptr = reinterpret_cast<int*>(&a + 1);
  qDebug() << *(reinterpret_cast<int*>(a + 1)) << *(ptr - 1);///>输出7 12

 输出结果是 7 12

 解题思路

&a+i = a+i*sizeof(a);
a+i = a+i*sizeof(a[0]);

参考

C++ primer 6图
C++primer plus 6

数组复习实践

沾几张图

C++primer plus 6
C++primer plus 6
C++primer plus 6
C++primer plus 6

测试下

//---------------------------数组
  //数组初始化
  int crd[4] = {4, 4, 4, 4}; ///>ok
  int crd1[3];///>ok

// 1- 不可赋值错误:error: array type 'int [3]' is not assignable,不可赋值
//  crd1 = {3,3,3};
//  crd1 = crd;
  //部分初始化
  double tips[5] = {3.44, 5.2};///>部分初始化,其他设置为0
  qDebug() << tips[0] << tips[2]; ///>输出3.44 0
  //[]为空时,编译器会计算数组的大小,但是这个是和很糟糕的做法,但这种做法在字符数组初始化为一个字符串时比较好
  short tips2[] = {2, 3, 4, 5, 5, 5, 5, 5};
  qDebug() << sizeof (tips2);///>输出16 = 2*8
  //c++11初始化数组的玩法
  //1-省略等号
  double ee[4] {1.2, 2.3, 3, 3};
  //2-{}不包含任何东西
  double ee1[4] = {};///>初始化为0
  double ee2[4] {};
  //3-列表初始化进制缩窄转换,插入显式强制转换以消除此问题
  //  long ee3[4]{1.2,2.3,3,3};///>error: type 'double' cannot be narrowed to 'long' in initializer list
  char ee4[3] {11, 22, '1'}; ///>ok
  //字符数组初始化
  char str[3] = {'2', '2', '3'}; ///>不是一个字符串
  char str1[3] = {'2', '2', '\0'}; ///>是一个字符串
  //字面常量初始化
  char str2[] = "123456";
//  char str3[7] = "1234567";///> error: initializer-string for char array is too long
  char str4[7] = "123456";
  qDebug() << sizeof (str2) << sizeof (str4);///>输出 7 7
  //  "123456"实际标识的是字符串所在的内存地址
  //  char addr = "123";///>error: cannot initialize a variable of type 'char' with an lvalue of type 'const char [4]'

指针复习实践

沾图

C++primer plus 6 指针的初始化
C++primer plus 6 函数指针的声明
函数指针的使用

测试下


  int i1 = 6;
  long long i2 = 3;
  quint64 i3 = 333;
  int *p = &i1;
  long long *p1 = (static_cast<long long *>(&i2));
  quint64 *p2 = &i3;
  qDebug() << sizeof (p) << sizeof (p1) << sizeof (p2);///>输出:4 4 4
  int *p3, p4; ///>p3是个指针,p4是个int
  //1 函数指针
  double pf1(int);///>函数
  double (*pf)(int);///>函数指针,pf是一个指向函数的指针
 //  double*pf1(int)///>一个返回值是double指针的话术,这里不让定义一个函数
  pf = pf1;///>pf是指针pf1()指针;注:pf1()函数的返回值和参数必须与pf的类型相同
  double pf2(double);
  /**
    error: assigning to 'double (*)(int)' from incompatible type 'double (double)':
    type mismatch at 1st parameter ('int' vs 'double')
  */
  //pf = pf2;
  //2 使用函数指针调用函数,以下两种方式均可
  double vv = pf(3);///>使用函数名
  double vv1 = (*pf)(4);///>使用函数指针,这种方式清晰
  //3 复杂一点的函数指针
  //3-1 以下函数的特征值和返回值均一样
  const double * f1(const double ar[],int n);
  const double * f2(const double [],int n);
  const double * f3(const double *,int n);
  //3-2 声明一个函数指针
  //3-2-1
  const double * (*f4)(const double ar[],int n);///>先声明
  f4 = f1; f4 = f2; f4 = f3;
  //3-2-2
  const double * (*f5)(const double ar[],int n) = f1;///>声明时就初始化
  //3-2-3 C++自己推断
  auto f6 = f1;
  //3-2-4 声明一个三个指针的数组,[]的优先级高于* ,*f7[3]是一个包含三个函数指针的数组,(*f7)[3],那么就是一个指针,指向三个元素的数组
  const double * (*f7[3])(const double ar[],int n) = {f1,f2,f3};///>声明时就初始化
  //3-2-4-2 以上这种情况不能用auto,auto只能用于单值初始化
  auto f8 = f7;
  //3-2-4-3 调用函数
  double aa[] = {1.1,2.2,3.3};
  const double * ppx = f7[0](aa,3);
  const double * ppx1 = (*f8[1])(aa,3);
  //3-2-4-4 获取指向double的值
  double ppxv = *f7[0](aa,3);
  double ppx1v = *(*f8[1])(aa,3);
  /**
    注意:*f7[3]中 f7是&f7[0],&f7是整个数组的地址(包含三个指针的地址),f7+1是数组中的下一个元素,&f7+1则是sizeof(f7)+f7
  */

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-西门吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值