如果我有一个指向char*s数组的指针,换句话说,一个名为p1的char**,如果我这样做(char*)p1我会得到什么?我猜测会有一些精度损失.我会丢失哪些信息,以及p1现在指向的是什么?谢谢!
如果您曾询问过将a转换int **为an int *,答案会有所不同.让我们首先考虑一下,因为我怀疑它更能代表您打算提出的问题,而且char *案例更复杂,因为其中涉及一个特殊目的.
假设你有几个int:int a, b, c, d;.你可以创建一个指向它们的数组:int *p[] = { &a, &b, &c, &d };.您还可以指向其中一个指针:int **q = &p[1];.现在q指向p[1],其中包含的地址b.
编写时*q,编译器知道q指向a的指针int,因此它知道*q指向a int.如果你编写**q,编译器知道*q指向一个int,*q将从内存中获取并使用它作为一个地址来获取int.
如果您转换q为int *并尝试使用它会发生什么printf("%d\n", * (int *) q);?转换q为a时,int *您(错误地)告诉编译器将其视为指向的指针int.然后,* (int *) q告诉编译器转到该地址并获取int.
这是无效代码 - 其行为未由C标准定义.具体来说,它违反了C 2018 6.5 7,它表示只能通过具有正确类型的左值表达式访问对象 - 与实际对象的类型兼容的类型或某些其他情况,这里都不适用.在地点q,有一个指针指向int,但你试图访问它,就像它是一个int,这是不允许的.
现在,让我们考虑char **到char *的情况.和以前一样,你可能需要一些char **q并将其转换为char *.现在,你告诉编译器去的地方q点,那里有一个指针char,并且如果有一个访问该存储位置char在那里.
C对此案件有特殊规则.您是允许以检查通过一个访问它们弥补对象的字节char *.因此,如果将a转换char **为char *并使用它,* (char *) q则结果将是构成指针的第一个(最低寻址的)字节.您甚至可以使用以下代码查看其余字节:
char *t = (char *) q;
printf("%d\n", t[0]);
printf("%d\n", t[1]);
printf("%d\n", t[2]);
printf("%d\n", t[3]);
Run Code Online (Sandbox Code Playgroud)
此代码将显示组成指针的前四个字节的十进制值,该指针char位于指定的位置q.
总之,将a转换char **为char *允许您检查表示a的字节char *.但是,通常,您不应将一个间接级别的指针转换为另一个间接级别的指针.
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |