如何仅使用指针算法访问结构中的数组

时间:2015-06-25 22:56:38

标签: c struct pointer-arithmetic

是否可以执行与下面相同的操作,但不使用[]->

我不明白为什么.*(points + 2)无效。不应该替换阵列吗?

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int points[2];
}_student;

int foo(_student *stud);

int main()
{
    int second;
    _student students[2];
    students[1].points[1] = 100;
    second = foo(students);

    printf("%d", second); 
    return 0;
}

int foo(_student *stud) // returns 3rd member of the array within a struct
{
    int second;
    second =  (*(stud+1)).points[1]; // Works
    //second =  (*(stud+1)).*(points+1);  ----> Does not work!

    return second;
}

结果应为100。

1 个答案:

答案 0 :(得分:3)

你没有说你的代码失败了什么,但不管它是什么,都是因为缓冲区溢出。

下面

_student students[2];
students[2].points[2] = 100;

你不能访问students[2],因为它是第三个元素,你的数组只有两个,访问第三个元素会调用未定义的行为,当然points也是如此。

在c中,数组索引从0开始,而不是1,因此第二个元素将是

_student students[2];
students[1].points[1] = 100;

同样不要对类型名称使用那种标识符,这是非常令人困惑的,并且通常最好在某些东西是结构时说清楚,就像在这种情况下一样。

我会推荐以下

struct student {
    int points[2];
};

struct student students[2];
students[1].points[1] = 100;

编辑:由于现在编辑的问题上面的内容似乎不合逻辑或不正确,实际问题是这个语法

second =  (*(stud+1)).*(points+1);  /* ----> Does not work for sure ! */

无效,显而易见的方法是

second =  *((*(stud + 1)).points + 1); /* ----> Does work! */

甚至

second =  *((stud + 1)->points + 1); /* ----> Does work! */
  

我不明白为什么.*(points + 2)不起作用。这不应该取代阵列吗?

一个好问题是,为什么你认为它应该有效?