目录
题目
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]);
参考
数组复习实践
沾几张图
测试下
//---------------------------数组
//数组初始化
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]'
指针复习实践
沾图
测试下
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
*/