首页 > 解决方案 > 包含指针的结构上的指针:数组命名法有效,但不是 (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)。

标签: arrayscpointers

解决方案


使用((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);。)


推荐阅读