出于工作需要 今天接触了一直以来很抗拒的做法 使用了指针的指针 下面直接上示例吧 有代码看起来好看些
const char cstr_dt[] = {'D', 'T'};
const char ]str_sn[] = {'S', 'N'};
const char cstr_zi[] = {'Z', 'I'};
const char cstr_bp[] = {'B', 'P'};
const char cstr_ver[] = {'V', 'E', 'R'};
const char cstr_off[] = {'O', 'F', 'F'};
const char cstr_act[] = {'A', 'C', 'T'};
const char cstr_sit[] = {'S', 'I', 'T'};
const char cstr_lan[] = {'L', 'A', 'N'};
const char cstr_run[] = {'R', 'U', 'N'};
const char cstr_sny[] = {'S', 'N', 'Y'};
const char cstr_pai[] = {'P', 'A', 'I'};
const char cstr_sex[] = {'S', 'E', 'X'};
const char cstr_pace[] = {'P', 'A', 'C', 'E'};
const char cstr_data[] = {'D', 'A', 'T', 'A'};
const char cstr_upgb[] = {'U', 'P', 'G', 'B'};
const char *cstr_atCmd[] = {
cstr_dt, cstr_sn, cstr_zi, cstr_bp, cstr_ver, cstr_off, cstr_act, cstr_sit, cstr_lan, cstr_run, cstr_sny, cstr_pai, cstr_sex, cstr_pace, cstr_data, cstr_upgb
};
const char *g_addr0, *g_addr1;
void func_test(void){
const char **ptr_cmdTbl = cstr_atCmd;
unsigned char pos = 3;
g_addr0 = cstr_atCmd[3];///这里存的是cstr_bp的地址
g_addr1 = *ptr_cmdTbl + 3 * sizeof(ptr_cmdTbl);///这里会发现g_addr0 != g_addr1
///正确的取法是 g_addr1 = *(ptr_cmdTbl + 3);
}
下面讲解一下 其实也是我自己坑了自己 语法基础不好 没办法
按照指针的指针定义 就是 指向指针变量的指针 由于目标cstr_atCmd[]是个存放const char指针的数组,所以可以用指向char指针的指针或者是指向const char指针的指针指向它,或者讲,用指向该类型的指针来存放该数组起始地址。
那么当const char **ptr_cmdTbl = cstr_atCmd执行后,ptr_cmdTbl这个指针上存放的就是cstr_atCmd的起始地址了。而当我需要获取cstr_atCmd的起始地址时,我就应该是这样调用的ptr_cmdTbl等同于&cstr_atCmd[0],那么以此类推ptr_cmdTbl + 1即等于&cstr_atCmd[1]。
也就是指针的指针其实跟一般的指针是一样的,只是指向的数据类型是指针类型而已。并没有我原本的写法那么复杂。MARK!