Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 包含指针的结构上的指针:数组命名法有效,但无效(ptr+;1)。为什么?_Arrays_C_Pointers - Fatal编程技术网

Arrays 包含指针的结构上的指针:数组命名法有效,但无效(ptr+;1)。为什么?

Arrays 包含指针的结构上的指针:数组命名法有效,但无效(ptr+;1)。为什么?,arrays,c,pointers,Arrays,C,Pointers,我很难制定我的问题,所以我使用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() {

我很难制定我的问题,所以我使用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;
}

使用(ptr+1术语)

谢谢

让·弗朗索瓦

编辑:对于阅读这个问题的其他人来说,我的误解是因为我认为数组[I]等于(数组+I)。这是一个错误,数组[i]等于*(数组+i)。

使用
((GlobalDevice+1)->数据)+1
,甚至只是
(GlobalDevice+1)->数据+1

数据本身不是指针,它是一个成员名,除了在
->
的右侧之外,它本身作为表达式没有任何意义。尤其是作为
+
的操作数,它毫无意义

更正:
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);
printf(“%c”,TestChar);

(GlobalDevice+1)
GlobalDevice不同[1] 
。我同意数组命名法更容易编写,但我正在努力深入理解指针。你的回答很有道理。我将结束这个问题。谢谢。
(GlobalDevice + 1)->(Data + 1)
TestChar = GlobalDevice[1].Data[1];