首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PrintCat1(猫猫)诉。PrintCat2(猫猫)&更多的指针问题

PrintCat1(猫猫)诉。PrintCat2(猫猫)&更多的指针问题
EN

Stack Overflow用户
提问于 2021-12-10 12:33:25
回答 2查看 91关注 0票数 -2

可能已经提出了以下问题。此外,我意识到,有许多帖子讨论这一主题。然而,在搜索之后,我找不到那些具体问题的答案。

注意:问题出现在代码下面。

守则:

代码语言:javascript
运行
复制
#include <stdio.h>

#define ARRAY_SIZE 3

typedef struct
{
    const char* name;
    const char* color;
    int age;
}Cat;

void printCat1(Cat* cat)
{
    printf("\n%s\n", cat->name);
    printf("%s\n", cat->color);
    printf("%d\n", cat->age);
    printf("\n");
}

void printCat2(Cat cat)
{
    printf("\n%s\n", cat.name);
    printf("%s\n", cat.color);
    printf("%d\n", cat.age);
    printf("\n");
}

void printCatArray(Cat catArr[])
{
    int i = 0;
    for (i = 0; i < ARRAY_SIZE; i++)
    {
        //WHICH OPTION IS BETTER? (printCat1 OR printCat2)
        //CALLING TO PRINTING FUNCTION.
    }

}

void swap(_____ cat1, _____ cat2)
{
    Cat temp = //cat1 or *cat1 ?
    //cat1 = cat2 or *cat1 = *cat2?
    cat2 = temp;
}

void sortbyage(Cat catarr[])
{
    int i, j;
    for (i = 0; i < ARRAY_SIZE - 1; i++)
        for (j = 1; j < ARRAY_SIZE; j++)
            if (catarr[i].age > catarr[j].age)
                swap(______, ______]);
}
int main() {
    Cat catArray[ARRAY_SIZE] =
    { {"cat1", "white", 1},
      {"cat2", "black", 2},
      {"cat3", "gray", 3} };


    printCatArray(catArray);


    return 0;
}

问题如下:

1。打印单个cat结构数据的两个函数之间有什么区别?

2。哪种打印功能更适合使用?为什么?如果你愿意解释的话,这将是非常重要和有意义的。

3。有什么更好写,为什么?空交换(猫cat1,猫cat2)或空交换(猫* cat1,猫* cat2)

4。从函数soryByAge (&catArri,&catArrj)调用交换函数,对吗?你能用不同的方式写吗?

5。下面的代码行是正确的: catArray2 = catArray1;很好地了解它的实际操作。

如果其中一个或多个问题不够清楚,我很乐意澄清。

非常感谢您事先!

EN

回答 2

Stack Overflow用户

发布于 2021-12-10 14:44:13

printCat1使用指针,它的效率更高,因为它不会造成临时复制。

printCat2传递值,它复制cat,效率较低。

swap函数必须使用指针。如果没有,它将简单地交换复制的值。原始数组将保持不变。

代码语言:javascript
运行
复制
void swap(Cat *cat1, Cat* cat2)
{
    Cat temp = *cat1;
    *cat1 = *cat2;
    *cat2 = temp;
}

将参数传递给swap时,请使用变量的地址。例如,

代码语言:javascript
运行
复制
swap(&arr[i], &arr[j]);
printCat1(&arr[i]);

结构:

代码语言:javascript
运行
复制
typedef struct
{
    const char* name;
    const char* color;
    int age;
}Cat;

...
Cat catArray[ARRAY_SIZE] =
{ {"cat1", "white", 1},
  {"cat2", "black", 2},
  {"cat3", "gray", 3} };

您希望将字符串声明为字符数组。

代码语言:javascript
运行
复制
typedef struct
{ char name[50]; char color[50]; int age; }Cat;

或声明为指针并动态分配。

票数 0
EN

Stack Overflow用户

发布于 2021-12-10 16:00:32

  1. 我不会宣布猫的名字和颜色为const。如果它们被定义为const,您将无法更改它的运行时,例如从用户那里获取它或用数据库读取文件。
  2. foo(cat cats[])foo(cat *cats)与作为指针传递的数组完全相同。传递大小也很好,因为在现实生活中,你不知道数组是大的。
  3. void swap(Cat cat1, Cat cat2)void swap(Cat* cat1, Cat* cat2) -第一个将在结构的本地副本上工作。它不会影响原始数组。因此,只有第二个版本才会做些力所能及的事情。
  4. 这是正确的做法。还可以从不同的数组交换结构。还可以将索引添加到指针(如下面的示例所示)。
  5. 它将整个结构从索引1复制到索引2的结构。之后,在索引12上将有相同的元素。
代码语言:javascript
运行
复制
typedef struct
{
    char* name;
    char* color;
    int age;
}Cat;

void printCat1(const Cat* cat)
{
    printf("\n%s\n", cat->name);
    printf("%s\n", cat->color);
    printf("%d\n", cat->age);
    printf("\n");
}

void printCat2(Cat cat)
{
    printf("\n%s\n", cat.name);
    printf("%s\n", cat.color);
    printf("%d\n", cat.age);
    printf("\n");
}

void printCatArray(const Cat *catArr, size_t size)
{
    for (size_t i = 0; i < size; i++)
    {
        printCat1(catArr + i);
        /* or */
        printCat2(catArr[i]);  // in this case the whole structure will passed to the function
    }

}

void swap(Cat *cat1, Cat *cat2)
{
    Cat temp = *cat1;
    *cat1 = *cat2;
    *cat2 = temp;
}

void sortbyage(Cat *catarr, size_t size)
{
    size_t i, j;
    for (i = 0; i < size - 1; i++)
        for (j = 1; j < size; j++)
            if (catarr[i].age > catarr[j].age)
                swap(catarr + i, catarr + j);
}
int main() {
    Cat catArray[] =
    { {"cat1", "white", 1},
      {"cat2", "black", 2},
      {"cat3", "gray", 3} };


    printCatArray(catArray, sizeof(catArray) / sizeof(catArray[0]));
}

https://godbolt.org/z/xodsToqxa

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70304587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档