将指针/引用传递给结构[英] Passing pointers/references to structs into functions

本文是小编为大家收集整理的关于将指针/引用传递给结构的处理方法,想解了将指针/引用传递给结构的问题怎么解决?将指针/引用传递给结构问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

这将听起来像一个愚蠢的问题,但我还在学习c,所以请忍受我. :)

我正在研究K&R(Structs)的第6章,到目前为止,通过这本书已经取得了巨大的成功.我决定使用结构非常重大,因此在章节和重新示例的章节中提前做了很多工作.我想尝试尝试的一件事正在改变canonrect函数(第2版,p 131)通过指针工作,因此返回void.

我有这个工作,但跑进一个打嗝我希望你们可以帮助我.我想要canonRect创建一个临时矩形对象,执行其更改,然后重新分配它传递给临时矩形的指针,从而简化代码.

但是,如果我这样做,RED不会改变.相反,我发现自己手动重新扣除我传递的red的字段,它确实有效.

代码如下:

#include <stdio.h>

#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))

struct point {
    int x;
    int y;
};

struct rect {
    struct point lowerLeft;
    struct point upperRight;
};

// canonicalize coordinates of rectangle
void canonRect(struct rect *r);

int main(void) {
    struct point p1, p2;
    struct rect r;

    p1.x = 10;
    p1.y = 10;
    p2.x = 20;
    p2.y = 40;
    r.lowerLeft = p2; // note that I'm inverting my points intentionally
    r.upperRight = p1;

    printf("Rectangle, lower left: %d, %d; upper right: %d %d\n\n", 
        r.lowerLeft.x, r.lowerLeft.y, r.upperRight.x, r.upperRight.y);

    // can't pass a pointer, only a reference. 
    // (Passing pointers results in illegal indirection compile time errors)
    canonRect(&r); 
    printf("Rectangle, lower left: %d, %d; upper right: %d %d\n\n", 
        r.lowerLeft.x, r.lowerLeft.y, r.upperRight.x, r.upperRight.y);    
}

void canonRect(struct rect *r) {
    struct rect temp;
    temp.lowerLeft.x = min(r->lowerLeft.x, r->upperRight.x);
    temp.lowerLeft.y = min(r->lowerLeft.y, r->upperRight.y);
    temp.upperRight.x = max(r->lowerLeft.x, r->upperRight.x);
    temp.upperRight.y = max(r->lowerLeft.y, r->upperRight.y);

    r = &temp; // doesn't work; my passed-in rect remains the same

    // I wind up doing the following instead, to reassign all 
    // the members of my passed-in rect
    //r->lowerLeft = temp.lowerLeft;
    //r->upperRight = temp.upperRight;
}
所以这里有问题:

  1. 为什么r = &temp;不起作用? (我认为这是因为我通过了引用而不是指针;我是否正确地认为引用不是可修改但指针是什么?)
  2. 为什么如果我尝试将指向canonRect传递给一个指针? (即,如果我在main()中有canonRect(*r);.)

我怀疑我已经知道了#1的答案,但#2困扰着我 - 我认为通过指针是合法的.

无论如何...请原谅c newb.

推荐答案

我认为你想做的就是这样:

void canonRect(struct rect *r) {
    struct rect temp;
    temp.lowerLeft.x = min(r->lowerLeft.x, r->upperRight.x);
    temp.lowerLeft.y = min(r->lowerLeft.y, r->upperRight.y);
    temp.upperRight.x = max(r->lowerLeft.x, r->upperRight.x);
    temp.upperRight.y = max(r->lowerLeft.y, r->upperRight.y);

    *r = temp; 
}

在上面的代码中,您将设置* r为rect to teor type type类型.

Re 1:如果要更改R指向的是,需要将指针指向指针.如果这真的是你想要的(见上文,那不是真的你想要的)那么你必须确保将它指向堆上的东西.如果您将它指向未与"新建"或MALLOC创建的东西,那么它将脱离范围,并且您将指向不再用于该变量的内存.

为什么您的代码与r =&temp?

因为r是rect *类型.这意味着R是一个可变的变量,该变量包含一个内存包含RECT的内存地址.如果更改R指向的是,那很好,但不会在变量中改变传递.

Re 2:*当未在类型声明中使用时是Dereference Unary运算符.这意味着它将查找指针地址内部的内容.所以通过通过* r,你根本没有传递指针.在脸上,由于r不是指针,这是无效的语法.

其他推荐答案

它还值得注意,您的变量'struct reb temp'将在该方法均匀结束时立即脱离范围,并且您将指向无效的内存.

其他推荐答案

听起来您将"取消引用"运算符(*)与"operator(&)困惑"困惑.

写入&r时,获取r的地址并返回指针到r(指针只是变量的内存地址).所以你真的通过指针进入函数.

写入*r时,您正在尝试解密r.如果r是指针,则将返回r指向的值.但是r不是指针,它是一个rect,所以你会得到一个错误.

使事情更令人困惑,在声明指针变量时也使用*字符.在此函数声明中:

void canonRect(struct rect *r) {

r被声明为指向a struct rect的指针.这与使用*完全不同:

canonRect(*r); 

在这两种情况下,*字符意味着完全不同的东西.

本文地址:https://www.itbaoku.cn/post/359167.html