以下問題可能已經被問到了。此外,我知道有很多帖子討論了這個話題。但是,經過搜索,我無法找到這些特定問題的答案。
注意:問題出現在代碼下方。
代碼:
#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 . 寫什么更好,為什么?void swap(Cat cat1, Cat cat2) 或 void swap(Cat* cat1, Cat* cat2)
4 . 從函式 soryByAge、swap(&catArr[i], &catArr[j]) 呼叫交換函式是否正確?你會寫不同的嗎?
5 . 下面這行代碼是正確的: catArray[2] = catArray[1]; 獲得有關它實際作用的解釋會很棒。
如果其中一個或多個問題不夠清楚,我將很樂意予以澄清。
事先非常感謝!
uj5u.com熱心網友回復:
printCat1 使用指標,效率更高,因為它不會臨時復制。
printCat2傳遞值,它復制了cat,效率較低。
swap函式必須使用指標。如果沒有,它只會交換復制的值。原始陣列將保持不變。
void swap(Cat *cat1, Cat* cat2)
{
Cat temp = *cat1;
*cat1 = *cat2;
*cat2 = temp;
}
將引數傳遞給 時swap,使用變數的地址。例如,
swap(&arr[i], &arr[j]);
printCat1(&arr[i]);
結構:
typedef struct
{
const char* name;
const char* color;
int age;
}Cat;
...
Cat catArray[ARRAY_SIZE] =
{ {"cat1", "white", 1},
{"cat2", "black", 2},
{"cat3", "gray", 3} };
您想將字串宣告為字符陣列。
typedef struct
{ char name[50]; char color[50]; int age; }Cat;
或者宣告為指標并動態分配。
uj5u.com熱心網友回復:
我不會將貓的名字和顏色宣告為
const. 如果它們被定義為const您將無法在運行時更改它,例如從用戶那里獲取它或使用您的資料庫讀取檔案。foo(cat cats[])并且foo(cat *cats)與作為指標傳遞的陣列完全相同。傳遞大小也很好,因為在現實生活中你不知道陣列有多大。void swap(Cat cat1, Cat cat2)或者void swap(Cat* cat1, Cat* cat2)- 第一個將處理結構的本地副本。它不會影響原始陣列。所以只有第二個版本會做一些有意義的事情。這是正確的做法。您還可以交換來自不同陣列的結構。您還可以為指標添加索引(如下例所示)
它將整個結構從索引復制到索引
1處的結構2。之后,您將在索引處擁有相同的元素,1并且2
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/385075.html
下一篇:C宣告混淆
