arrays - 包含指针的结构上的指针:数组命名法有效,但不是 (ptr + 1)。为什么?
问题描述
我很难提出我的问题,所以我使用 onlinegdb 创建了一个示例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
unsigned int GlobalHeader;
unsigned char * Data;
}GLOBAL_DEVICE;
GLOBAL_DEVICE * GlobalDevice;
int main()
{
GLOBAL_DEVICE GlobalTest[2];
GlobalDevice = GlobalTest;
char Buffer[] = {"ABCDEFG"};
char TestChar;
(GlobalDevice + 1)->Data = (char *)malloc(8 * sizeof(char));
memcpy((GlobalDevice + 1)->Data,Buffer,8);
//TestChar = (GlobalDevice + 1)->(Data + 1); <- This doesn't work. Error : expected identifier before '('
TestChar = (GlobalDevice + 1)->Data[1]; // This works
printf(&TestChar);
return 0;
}
如上例所述,为什么我可以在 GlobalDevice 指针上使用 (ptr+1) 命名法,但不能在 GlobalDevice 指向的结构中包含的 Data 指针上使用。我可以将数组表示法用于 Data 指针而没有错误。
我的理解是命名数组 [i] 等于 *(array + i) 并且适用于 GlobalDevice 指针。
那为什么我不能写
GlobalDevice[1]->Data[1]
使用 (ptr + 1 命名法)
(GlobalDevice + 1)->(Data + 1)
谢谢,
让-弗朗索瓦
编辑:对于阅读这个问题的其他人,我的误解来自于我认为 array[i] 等于 (array+i) 的事实。这是一个错误,array[i] 等于 *(array+i)。
解决方案
使用((GlobalDevice + 1)->Data) + 1
,甚至只是(GlobalDevice + 1)->Data + 1
。
Data
.
它本身不是一个指针,它是一个成员名称,除了or的右侧之外,它本身作为表达式没有任何意义->
。特别是它作为 . 的操作数毫无意义+
。
A 更正:array[i]
等价于array+i
,而不是*(array+i)
。所以正确的等价物(GlobalDevice + 1)->Data[1]
是*((GlobalDevice + 1)->Data + 1)
。
无论如何,我认为这[]
两个地方的语法都更清晰。我会写
TestChar = GlobalDevice[1].Data[1];
(顺便说一句,printf(&TestChar)
最后不起作用,因为TestChar
在内存中没有跟随空字符,所以&TestChar
不是字符串。而是写putchar(TestChar);
or printf("%c", TestChar);
。)
推荐阅读
- python - 在 python 中使用 Selenium 和来自 Docker 容器的无头 Chrome
- android - Unity ARFoundation Gradle 构建失败 - last-build.bin 访问被拒绝
- c - C - 请求非结构或联合的成员
- r - R:导入 Json 时出错
- jenkins - “hudson.plugins.git.GitException”错误,无法从 git 获取
- nuxt.js - 如何记录nuxt服务器端网络请求?
- apache-nifi - 如何在数据转换模板中增量/更新数据
- html - HTML浏览器不打印新行
- zpl - 将 HTTPResponse 转换为图像
- angular - jsPDF - Angular:HTML 到 PDF