- 1 1. ã¯ããã«
- 2 2. æ§é äœãšãã€ã³ã¿ã®åºç€ç¥è
- 3 3. æ§é äœãšã¯ïŒ
- 4 ãŸãšã
- 5 4. ãã€ã³ã¿ã®åºç€
- 6 ãŸãšã
- 7 5. æ§é äœãšãã€ã³ã¿ã®çµã¿åãã
- 8 ãŸãšã
- 9 6. é¢æ°ãšæ§é äœãã€ã³ã¿ã®é£æº
- 10 ãŸãšã
- 11 7. æ§é äœå ã§ã®ãã€ã³ã¿æŽ»çš
- 12 ãŸãšã
- 13 8. å®è·µäŸïŒé£çµãªã¹ãã®äœæ
- 14 ãŸãšã
- 15 9. ããããééããšãããã°æ¹æ³
- 16 ãŸãšã
- 17 10. ãŸãšã
- 18 æåŸã«
1. ã¯ããã«
Cèšèªã¯ã·ã¹ãã éçºãçµã¿èŸŒã¿ããã°ã©ã ãªã©ã§åºã䜿çšãããŠããããã°ã©ãã³ã°èšèªã§ãããã®äžã§ããæ§é äœããšããã€ã³ã¿ãã¯ãå¹ççãªããŒã¿ç®¡çãã¡ã¢ãªæäœãå®çŸããããã«æ¬ ãããªãèŠçŽ ã§ããæ¬èšäºã§ã¯ããããã®æŠå¿µã«ã€ããŠåºç€ããå¿çšãŸã§ã詳ãã解説ããŸãã
ãã®èšäºãèªãããšã§ãCèšèªã«ãããæ§é äœãšãã€ã³ã¿ã®åœ¹å²ãç解ããå®è·µçãªã³ãŒãäŸãéããŠäœ¿ãæ¹ããã¹ã¿ãŒã§ããããã«ãªããŸããåå¿è ã®æ¹ã§ãç解ããããããã«ãå ·äœäŸã亀ããªããé²ããŠãããŸãã
2. æ§é äœãšãã€ã³ã¿ã®åºç€ç¥è
æ§é äœãšã¯äœãïŒ
æ§é äœã¯ãè€æ°ã®ç°ãªãåã®ããŒã¿ãäžã€ã«ãŸãšããŠæ±ãããã®ããŒã¿æ§é ã§ããããšãã°ã人ã®æ å ±ïŒååã幎霢ã身é·ãªã©ïŒãäžã€ã®åäœãšããŠç®¡çãããå Žåã«äŸ¿å©ã§ãã
以äžã®ã³ãŒãã¯ãæ§é äœã®åºæ¬çãªå®çŸ©ãšäœ¿çšäŸã瀺ããŠããŸãã
#include <stdio.h>
// æ§é äœã®å®çŸ©
struct Person {
char name[50];
int age;
float height;
};
int main() {
struct Person person1; // æ§é äœå€æ°ã®å®£èš
// ããŒã¿ã®ä»£å
¥
strcpy(person1.name, "Taro");
person1.age = 20;
person1.height = 170.5;
// ããŒã¿ã®è¡šç€º
printf("åå: %s\n", person1.name);
printf("幎霢: %d\n", person1.age);
printf("身é·: %.1fcm\n", person1.height);
return 0;
}
ãã®äŸã§ã¯ãPerson
ãšããæ§é äœãå®çŸ©ãã3ã€ã®ç°ãªãããŒã¿åã1ã€ã®ããŒã¿æ§é ã«ãŸãšããŠããŸããããã«ãããé¢é£ããããŒã¿ãäžå
管çã§ããããã«ãªããŸãã
ãã€ã³ã¿ãšã¯äœãïŒ
ãã€ã³ã¿ã¯ãå€æ°ã®ã¡ã¢ãªã¢ãã¬ã¹ãæ ŒçŽããããã®å€æ°ã§ããããã°ã©ã å ã§åçã«ã¡ã¢ãªãæäœããããã«äœ¿ãããŸãã以äžã¯ãã€ã³ã¿ã®åºæ¬äŸã§ãã
#include <stdio.h>
int main() {
int a = 10;
int *p; // ãã€ã³ã¿å€æ°ã®å®£èš
p = &a; // ãã€ã³ã¿ã«å€æ°aã®ã¢ãã¬ã¹ã代å
¥
printf("å€æ°aã®å€: %d\n", a);
printf("ãã€ã³ã¿pãæãå€: %d\n", *p);
return 0;
}
ãã®äŸã§ã¯ããã€ã³ã¿å€æ°p
ã䜿ã£ãŠå€æ°a
ã®å€ã«ã¢ã¯ã»ã¹ããŠããŸãããã€ã³ã¿ã¯ã¡ã¢ãªæäœã«åŒ·åãªåœ¹å²ãæãããŸããã誀ã£ã䜿çšã«ãã£ãŠãã°ãã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ãããããã泚æãå¿
èŠã§ãã
æ§é äœãšãã€ã³ã¿ã®é¢ä¿
æ§é äœãšãã€ã³ã¿ãçµã¿åãããããšã§ãããæè»ãªããŒã¿æäœãå¯èœã«ãªããŸããããã«ã€ããŠã¯åŸè¿°ããã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãããåºæ¬æŠå¿µãæŒãããããšã§å¿çšã«ã¹ã ãŒãºã«é²ããããšãã§ããŸãã
3. æ§é äœãšã¯ïŒ
æ§é äœã®åºæ¬çãªå®çŸ©
æ§é äœã¯ãè€æ°ã®ç°ãªãåã®ããŒã¿ãã²ãšãŸãšãã«ããŠæ±ãããã®ããŒã¿æ§é ã§ããCèšèªã§ã¯ãé¢é£ããæ å ±ãã°ã«ãŒãåããããŒã¿ç®¡çãç°¡æœã«ããããã«ãã䜿çšãããŸãã
以äžã®ã³ãŒãã¯ãæ§é äœã®å®çŸ©äŸã§ãã
struct Person {
char name[50];
int age;
float height;
};
ãã®äŸã§ã¯ãPerson
ãšããååã®æ§é äœãå®çŸ©ãã次ã®3ã€ã®ã¡ã³ããŒãæã£ãŠããŸãã
name
ïŒæååïŒé åïŒãšããŠååãæ ŒçŽage
ïŒæŽæ°å€ãšããŠå¹Žéœ¢ãæ ŒçŽheight
ïŒæµ®åå°æ°ç¹æ°ãšããŠèº«é·ãæ ŒçŽ
æ§é äœã®å®çŸ©ã¯ãåãã®å®£èšã§ãããããã䜿ã£ãŠå ·äœçãªå€æ°ãäœæããŸãã
æ§é äœå€æ°ã®å®£èšãšäœ¿çš
æ§é äœã䜿ãã«ã¯ããŸãå€æ°ã宣èšããŸãã以äžã¯ãã®äŸã§ãã
#include <stdio.h>
#include <string.h>
struct Person {
char name[50];
int age;
float height;
};
int main() {
struct Person person1; // æ§é äœå€æ°ã®å®£èš
// ããŒã¿ã®ä»£å
¥
strcpy(person1.name, "Taro");
person1.age = 20;
person1.height = 170.5;
// ããŒã¿ã®è¡šç€º
printf("åå: %s\n", person1.name);
printf("幎霢: %d\n", person1.age);
printf("身é·: %.1fcm\n", person1.height);
return 0;
}
ãã®ã³ãŒãã§ã¯ãperson1
ãšããæ§é äœå€æ°ã宣èšããåã¡ã³ããŒã«å€ã代å
¥ããŠããŸãã
æ§é äœã®åæå
æ§é äœå€æ°ã¯å®£èšæã«åæåããããšãã§ããŸãã
struct Person person2 = {"Hanako", 25, 160.0};
ãã®ããã«ãŸãšããŠåæåããããšã§ãã³ãŒããç°¡æœã«èšè¿°ã§ããŸãã
æ§é äœã®é å
è€æ°ã®ããŒã¿ã管çããå Žåã¯ãæ§é äœã®é åã䜿çšããŸãã
struct Person people[2] = {
{"Taro", 20, 170.5},
{"Hanako", 25, 160.0}
};
for (int i = 0; i < 2; i++) {
printf("åå: %s, 幎霢: %d, 身é·: %.1fcm\n", people[i].name, people[i].age, people[i].height);
}
ãã®äŸã§ã¯ã2人åã®ããŒã¿ãé åã§ç®¡çããã«ãŒãã䜿ã£ãŠäžæ¬ã§åŠçããŠããŸãã
æ§é äœãé¢æ°ã«æž¡ã
æ§é äœã¯é¢æ°ã«æž¡ããŠåŠçããããšãå¯èœã§ãã以äžã¯ãã®äŸã§ãã
void printPerson(struct Person p) {
printf("åå: %s, 幎霢: %d, 身é·: %.1fcm\n", p.name, p.age, p.height);
}
ãã®é¢æ°ã¯ãåŒæ°ãšããŠæ§é äœãåãåãããã®æ å ±ã衚瀺ããŸãã
ãŸãšã
æ§é äœã¯ãé¢é£ããããŒã¿ãã²ãšãŸãšãŸãã«ç®¡çããããã«éåžžã«äŸ¿å©ãªããŒã¿åã§ããåºæ¬çãªäœ¿ãæ¹ããã¹ã¿ãŒããããšã§ãããŒã¿ã®æŽçãã¢ã¯ã»ã¹ãå¹çåãããŸãã
4. ãã€ã³ã¿ã®åºç€
ãã€ã³ã¿ãšã¯ïŒ
ãã€ã³ã¿ã¯ãå€æ°ã®ã¡ã¢ãªã¢ãã¬ã¹ãçŽæ¥æäœã§ããCèšèªã®åŒ·åãªæ©èœã§ãããã®ã»ã¯ã·ã§ã³ã§ã¯ããã€ã³ã¿ã®åºæ¬æŠå¿µãã宣èšã䜿çšæ¹æ³ããããŠå ·äœäŸãŸã§è©³ãã解説ããŸãã
ãã€ã³ã¿ã®å®£èšãšåæå
ãã€ã³ã¿ã¯ãåã®åã«*
ãä»ããŠå®£èšããŸãã
int a = 10; // éåžžã®å€æ°
int *p; // ãã€ã³ã¿å€æ°ã®å®£èš
p = &a; // pã«aã®ã¢ãã¬ã¹ã代å
¥
*p
ã¯ãã€ã³ã¿ãæãã¢ãã¬ã¹ã®ãå€ããè¡šããŸãïŒéæ¥åç §ïŒã&a
ã¯å€æ°a
ã®ã¢ãã¬ã¹ãååŸããŸãïŒã¢ãã¬ã¹æŒç®åïŒã
ãã€ã³ã¿ã«ããå€ã®æäœ
ãã€ã³ã¿ã䜿çšããŠå€ãæäœããäŸãèŠãŠã¿ãŸãããã
#include <stdio.h>
int main() {
int a = 10; // éåžžã®å€æ°
int *p = &a; // ãã€ã³ã¿å€æ°pã宣èšããaã®ã¢ãã¬ã¹ã代å
¥
printf("aã®å€: %d\n", a); // 10
printf("aã®ã¢ãã¬ã¹: %p\n", &a); // aã®ã¢ãã¬ã¹
printf("pã®å€(ã¢ãã¬ã¹): %p\n", p); // pã«æ ŒçŽãããŠããã¢ãã¬ã¹
printf("pãæãå€: %d\n", *p); // 10
*p = 20; // ãã€ã³ã¿çµç±ã§å€ãå€æŽ
printf("aã®æ°ããå€: %d\n", a); // 20
return 0;
}
ãã®ã³ãŒãã§ã¯ããã€ã³ã¿p
ã䜿ã£ãŠå€æ°a
ã®å€ãéæ¥çã«å€æŽããŠããŸãã
é åãšãã€ã³ã¿
é åã®èŠçŽ ãžã®ã¢ã¯ã»ã¹ããã€ã³ã¿ã䜿ã£ãŠè¡ããŸãã
#include <stdio.h>
int main() {
int arr[3] = {10, 20, 30};
int *p = arr; // é
åã®æåã®èŠçŽ ã®ã¢ãã¬ã¹ãæã
printf("1ã€ç®ã®èŠçŽ : %d\n", *p); // 10
printf("2ã€ç®ã®èŠçŽ : %d\n", *(p+1)); // 20
printf("3ã€ç®ã®èŠçŽ : %d\n", *(p+2)); // 30
return 0;
}
ãã®äŸã§ã¯ããã€ã³ã¿p
ã䜿ã£ãŠé
åã®åèŠçŽ ã«ã¢ã¯ã»ã¹ããŠããŸãã
ãŸãšã
ãã€ã³ã¿ã¯Cèšèªã«ãããŠéåžžã«éèŠãªæ©èœã§ãããå¹ççãªã¡ã¢ãªç®¡çãæè»ãªããã°ã©ã èšèšãå¯èœã«ããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ããã€ã³ã¿ã®åºæ¬æŠå¿µãšäœ¿çšæ¹æ³ãåŠã³ãŸããã次åã¯ã5. æ§é äœãšãã€ã³ã¿ã®çµã¿åãããã«ã€ããŠè©³ãã解説ããŸãã®ã§ãã楜ãã¿ã«ïŒ
5. æ§é äœãšãã€ã³ã¿ã®çµã¿åãã
æ§é äœãã€ã³ã¿ã®åºæ¬
æ§é äœãšãã€ã³ã¿ãçµã¿åãããããšã§ãããæè»ã§å¹ççãªããŒã¿ç®¡çãå¯èœã«ãªããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãæ§é äœãã€ã³ã¿ã®åºæ¬çãªäœ¿ãæ¹ããå¿çšäŸãŸã§ã解説ããŸãã
以äžã¯ãåºæ¬çãªæ§é äœãã€ã³ã¿ã®äŸã§ãã
#include <stdio.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Person {
char name[50];
int age;
float height;
};
int main() {
struct Person person1 = {"Taro", 20, 170.5}; // æ§é äœã®åæå
struct Person *p = &person1; // æ§é äœãã€ã³ã¿ã®å®£èšãšåæå
// ãã€ã³ã¿ã䜿ã£ãŠããŒã¿ã«ã¢ã¯ã»ã¹
printf("åå: %s\n", p->name);
printf("幎霢: %d\n", p->age);
printf("身é·: %.1fcm\n", p->height);
// ãã€ã³ã¿çµç±ã§å€ãå€æŽ
p->age = 25;
printf("å€æŽåŸã®å¹Žéœ¢: %d\n", p->age);
return 0;
}
åçã¡ã¢ãªå²ãåœãŠãšã®é£æº
æ§é äœãã€ã³ã¿ã¯åçã¡ã¢ãªå²ãåœãŠãšçžæ§ãè¯ãã倧éã®ããŒã¿ãæ±ãéã«äŸ¿å©ã§ãã以äžã¯ãã®äŸã§ãã
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Person {
char name[50];
int age;
float height;
};
int main() {
// åçã¡ã¢ãªå²ãåœãŠã«ããæ§é äœã®äœæ
struct Person *p = (struct Person *)malloc(sizeof(struct Person));
// ããŒã¿ã®ä»£å
¥
strcpy(p->name, "Hanako");
p->age = 22;
p->height = 160.0;
// ããŒã¿ã®è¡šç€º
printf("åå: %s\n", p->name);
printf("幎霢: %d\n", p->age);
printf("身é·: %.1fcm\n", p->height);
// ã¡ã¢ãªã®è§£æŸ
free(p);
return 0;
}
é åãšæ§é äœãã€ã³ã¿
æ§é äœã®é åãšãã€ã³ã¿ãçµã¿åãããããšã§ãè€æ°ã®ããŒã¿ãå¹çãã管çã§ããŸãã
#include <stdio.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Person {
char name[50];
int age;
float height;
};
int main() {
struct Person people[2] = {{"Taro", 20, 170.5}, {"Hanako", 25, 160.0}};
struct Person *p = people; // é
åã®å
é ã¢ãã¬ã¹ãæããã€ã³ã¿
for (int i = 0; i < 2; i++) {
printf("åå: %s\n", (p + i)->name);
printf("幎霢: %d\n", (p + i)->age);
printf("身é·: %.1fcm\n", (p + i)->height);
}
return 0;
}
ãŸãšã
æ§é äœãšãã€ã³ã¿ãçµã¿åãããããšã§ãããŒã¿ç®¡çã®å¹çåãã¡ã¢ãªæäœã®æè»æ§ãåäžããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯åºæ¬çãªäœ¿ãæ¹ããåçã¡ã¢ãªå²ãåœãŠãŸã§ãã«ããŒããŸããã
6. é¢æ°ãšæ§é äœãã€ã³ã¿ã®é£æº
æ§é äœãé¢æ°ã«æž¡ãæ¹æ³
æ§é äœãé¢æ°ã«æž¡ãéã«ã¯ä»¥äžã®2ã€ã®æ¹æ³ããããŸãã
- å€æž¡ã
æ§é äœå šäœã®ã³ããŒãé¢æ°ã«æž¡ããŸããã倧ããªããŒã¿ã®å Žåã¯ã¡ã¢ãªãå€ãæ¶è²»ããŸãã - åç
§æž¡ãïŒãã€ã³ã¿æž¡ãïŒ
æ§é äœã®ã¢ãã¬ã¹ãæž¡ãããšã§ã¡ã¢ãªå¹çãåäžããé¢æ°å ã§å ã®ããŒã¿ãçŽæ¥æäœã§ããŸãã
å€æž¡ãã®äŸ
#include <stdio.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Person {
char name[50];
int age;
};
// é¢æ°: å€æž¡ã
void printPerson(struct Person p) {
printf("åå: %s\n", p.name);
printf("幎霢: %d\n", p.age);
}
int main() {
struct Person person1 = {"Taro", 20};
printPerson(person1); // å€æž¡ã
return 0;
}
ãã®äŸã§ã¯ãé¢æ°printPerson
ã«æ§é äœãå€æž¡ãã§æž¡ããŠããŸãããã ãã倧ããªããŒã¿ãæ±ãå Žåã¯ã¡ã¢ãªå¹çãæªããªããŸãã
åç §æž¡ãïŒãã€ã³ã¿æž¡ãïŒã®äŸ
#include <stdio.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Person {
char name[50];
int age;
};
// é¢æ°: ãã€ã³ã¿æž¡ã
void updateAge(struct Person *p) {
p->age += 1; // 幎霢ã1å¢å
}
void printPerson(const struct Person *p) {
printf("åå: %s\n", p->name);
printf("幎霢: %d\n", p->age);
}
int main() {
struct Person person1 = {"Hanako", 25};
printf("å€æŽå:\n");
printPerson(&person1);
updateAge(&person1); // ãã€ã³ã¿æž¡ãã§å¹Žéœ¢ãæŽæ°
printf("å€æŽåŸ:\n");
printPerson(&person1);
return 0;
}
ãã®äŸã§ã¯ããã€ã³ã¿ã䜿ã£ãŠæ§é äœãé¢æ°ã«æž¡ããŠããŸããé¢æ°updateAge
ã¯ãã€ã³ã¿ãä»ããŠå
ã®ããŒã¿ãçŽæ¥å€æŽããŸãã
åçã¡ã¢ãªãšé¢æ°ã®é£æº
åçã«ç¢ºä¿ããã¡ã¢ãªé åã®ããŒã¿ãé¢æ°ã§åŠçã§ããŸãã
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Person {
char name[50];
int age;
};
// é¢æ°: ã¡ã¢ãªãåæå
struct Person *createPerson(const char *name, int age) {
struct Person *p = (struct Person *)malloc(sizeof(struct Person));
strcpy(p->name, name);
p->age = age;
return p;
}
// é¢æ°: æ
å ±ã衚瀺
void printPerson(const struct Person *p) {
printf("åå: %s\n", p->name);
printf("幎霢: %d\n", p->age);
}
// é¢æ°: ã¡ã¢ãªè§£æŸ
void deletePerson(struct Person *p) {
free(p);
}
int main() {
struct Person *person1 = createPerson("Taro", 30); // åçã«ã¡ã¢ãªç¢ºä¿
printPerson(person1);
deletePerson(person1); // ã¡ã¢ãªè§£æŸ
return 0;
}
ãã®äŸã§ã¯ãåçã¡ã¢ãªãå²ãåœãŠãŠæ§é äœã管çããé¢æ°ã䜿ã£ãŠããŒã¿ãæäœããŠããŸããã¡ã¢ãªç®¡çãé©åã«è¡ãããšã§ãå®å šãã€å¹ççã«ããã°ã©ã ãæ§ç¯ã§ããŸãã
ãŸãšã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãé¢æ°ãšæ§é äœãã€ã³ã¿ãçµã¿åããã䜿ãæ¹ã解説ããŸããããã€ã³ã¿ã䜿ãããšã§ãé¢æ°éã§ã®ããŒã¿å ±æãåçã¡ã¢ãªç®¡çãå¹çåã§ããŸãã
7. æ§é äœå ã§ã®ãã€ã³ã¿æŽ»çš
æ§é äœå ã§ãã€ã³ã¿ã䜿ãå©ç¹
æ§é äœã®äžã«ãã€ã³ã¿ãå«ããããšã§ãæè»ã§å¹ççãªããŒã¿ç®¡çãã¡ã¢ãªæäœãå¯èœã«ãªããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãæ§é äœå ã§ãã€ã³ã¿ã掻çšããåºæ¬çãªæ¹æ³ãå¿çšäŸã«ã€ããŠè§£èª¬ããŸãã
åºæ¬äŸïŒæååããŒã¿ã®åç管ç
以äžã®äŸã§ã¯ãæ§é äœå ã«ãã€ã³ã¿ãå«ããŠæååãåçã«ç®¡çããŸãã
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Person {
char *name; // ååçšã®ãã€ã³ã¿
int age;
};
// ã¡ã¢ãªå²ãåœãŠãšåæå
void setPerson(struct Person *p, const char *name, int age) {
p->name = (char *)malloc(strlen(name) + 1); // åçã¡ã¢ãªå²ãåœãŠ
strcpy(p->name, name);
p->age = age;
}
// æ
å ±ã®è¡šç€º
void printPerson(const struct Person *p) {
printf("åå: %s\n", p->name);
printf("幎霢: %d\n", p->age);
}
// ã¡ã¢ãªè§£æŸ
void freePerson(struct Person *p) {
free(p->name); // åçã¡ã¢ãªè§£æŸ
}
int main() {
struct Person person;
// ããŒã¿ã®èšå®
setPerson(&person, "Taro", 30);
// ããŒã¿ã®è¡šç€º
printPerson(&person);
// ã¡ã¢ãªã®è§£æŸ
freePerson(&person);
return 0;
}
ãã®äŸã§ã¯ãæååããŒã¿ãåçã«å²ãåœãŠãããšã§ãååã®é·ãã«äŸåããªãããŒã¿ç®¡çãå®çŸããŠããŸãããŸãã䜿çšåŸã«ã¯free
é¢æ°ã§ã¡ã¢ãªã解æŸããŠããŸãã
é åãšãã€ã³ã¿ã®çµã¿åãã
è€æ°ã®ããŒã¿ã管çããå Žåãããã€ã³ã¿ã䜿ãããšã§æè»ã«å¯Ÿå¿ã§ããŸãã
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// æ§é äœã®å®çŸ©
struct Student {
char *name;
int score;
};
// ã¡ã¢ãªå²ãåœãŠãšåæå
struct Student *createStudent(const char *name, int score) {
struct Student *s = (struct Student *)malloc(sizeof(struct Student));
s->name = (char *)malloc(strlen(name) + 1);
strcpy(s->name, name);
s->score = score;
return s;
}
// ã¡ã¢ãªè§£æŸ
void freeStudent(struct Student *s) {
free(s->name);
free(s);
}
int main() {
// åŠçæ
å ±ã®é
å
struct Student *students[2];
students[0] = createStudent("Taro", 85);
students[1] = createStudent("Hanako", 90);
// ããŒã¿ã®è¡šç€º
for (int i = 0; i < 2; i++) {
printf("åå: %s, ç¹æ°: %d\n", students[i]->name, students[i]->score);
}
// ã¡ã¢ãªã®è§£æŸ
for (int i = 0; i < 2; i++) {
freeStudent(students[i]);
}
return 0;
}
ãã®ã³ãŒãã§ã¯ãåŠçããŒã¿ãåçã«ç®¡çããå¿ èŠã«å¿ããŠæè»ã«æäœã§ããããã«ããŠããŸãã
ãŸãšã
æ§é äœå ã§ãã€ã³ã¿ã掻çšããããšã§ãåçã¡ã¢ãªç®¡çãè€éãªããŒã¿æ§é ã®èšèšã容æã«ãªããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯åºæ¬çãªäŸããå¿çšãŸã§ã解説ããŸããã
8. å®è·µäŸïŒé£çµãªã¹ãã®äœæ
é£çµãªã¹ãã®åºæ¬æ§é
é£çµãªã¹ãã¯ãããŒã¿ãããŒãåäœã§ç®¡çããåçã«èŠçŽ ãè¿œå ã»åé€ã§ããããŒã¿æ§é ã§ããCèšèªã§ã¯ãæ§é äœãšãã€ã³ã¿ãçµã¿åãããããšã§å®è£ ã§ããŸãã
以äžã®ãããªæ§é ãæã¡ãŸãã
[ããŒã¿ | 次ã®ããŒããžã®ãã€ã³ã¿] â [ããŒã¿ | 次ã®ããŒããžã®ãã€ã³ã¿] â NULL
åããŒãã¯ããŒã¿ãšæ¬¡ã®ããŒããžã®ãã€ã³ã¿ãä¿æããŸããæåŸã®ããŒãã®ãã€ã³ã¿ã¯NULL
ãæãããªã¹ãã®çµç«¯ã瀺ããŸãã
ããŒãã®å®çŸ©
以äžã¯ãé£çµãªã¹ãã®ããŒããè¡šãæ§é äœã®å®çŸ©ã§ãã
#include <stdio.h>
#include <stdlib.h>
// ããŒãã®å®çŸ©
struct Node {
int data; // ããŒã¿
struct Node *next; // 次ã®ããŒããžã®ãã€ã³ã¿
};
ããŒãã®è¿œå
以äžã®ã³ãŒãã¯ãé£çµãªã¹ãã®æ«å°Ÿã«ããŒããè¿œå ããäŸã§ãã
void append(struct Node **head, int newData) {
// æ°ããããŒãã®äœæ
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
struct Node *last = *head; // ãªã¹ãã®æ«å°Ÿãæ¢çŽ¢ããããã®ãã€ã³ã¿
newNode->data = newData; // ããŒã¿ã®èšå®
newNode->next = NULL; // æ°ããããŒãã¯æ«å°Ÿãªã®ã§ã次ã¯NULL
// ãªã¹ãã空ã®å Žå
if (*head == NULL) {
*head = newNode;
return;
}
// ãªã¹ãã®æ«å°ŸãŸã§ç§»å
while (last->next != NULL) {
last = last->next;
}
// æ«å°Ÿã«æ°ããããŒããè¿œå
last->next = newNode;
}
ããŒãã®è¡šç€º
ãªã¹ãã®ãã¹ãŠã®èŠçŽ ã衚瀺ããé¢æ°ã¯æ¬¡ã®éãã§ãã
void printList(struct Node *node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
ããŒãã®åé€
ç¹å®ã®ããŒã¿ãæã€ããŒããåé€ããé¢æ°ã¯ä»¥äžã®éãã§ãã
void deleteNode(struct Node **head, int key) {
struct Node *temp = *head, *prev;
// å
é ããŒããåé€å¯Ÿè±¡ã®å Žå
if (temp != NULL && temp->data == key) {
*head = temp->next;
free(temp);
return;
}
// åé€å¯Ÿè±¡ã®ããŒããæ¢çŽ¢
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
// ããŒãèŠã€ãããªãã£ãå Žå
if (temp == NULL) return;
// ããŒãããªã¹ãããé€å€
prev->next = temp->next;
free(temp);
}
å®è£ äŸïŒé£çµãªã¹ãã®æäœ
äžèšã®é¢æ°ãçµã¿åãããå®å šãªããã°ã©ã äŸã§ãã
#include <stdio.h>
#include <stdlib.h>
// ããŒãã®å®çŸ©
struct Node {
int data;
struct Node *next;
};
// ããŒããæ«å°Ÿã«è¿œå
void append(struct Node **head, int newData) {
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
struct Node *last = *head;
newNode->data = newData;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
while (last->next != NULL) {
last = last->next;
}
last->next = newNode;
}
// ãªã¹ãã®å
容ã衚瀺
void printList(struct Node *node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
// ããŒããåé€
void deleteNode(struct Node **head, int key) {
struct Node *temp = *head, *prev;
if (temp != NULL && temp->data == key) {
*head = temp->next;
free(temp);
return;
}
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) return;
prev->next = temp->next;
free(temp);
}
int main() {
struct Node *head = NULL;
// ããŒãã®è¿œå
append(&head, 10);
append(&head, 20);
append(&head, 30);
printf("é£çµãªã¹ãã®å
容:\n");
printList(head);
// ããŒãã®åé€
deleteNode(&head, 20);
printf("20ãåé€åŸ:\n");
printList(head);
return 0;
}
ãŸãšã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãæ§é äœãšãã€ã³ã¿ã䜿ã£ãé£çµãªã¹ãã®å®è£ æ¹æ³ã«ã€ããŠè©³ãã解説ããŸããã
é£çµãªã¹ãã¯ããµã€ãºå€æŽãããŒã¿ã®è¿œå ã»åé€ã容æãªãããå€ãã®ã¢ã«ãŽãªãºã ãããŒã¿ç®¡çã·ã¹ãã ã§äœ¿çšãããŠããŸãã
9. ããããééããšãããã°æ¹æ³
Cèšèªã«ãããæ§é äœãšãã€ã³ã¿ã®äœ¿çšã¯éåžžã«åŒ·åã§ãããééã£ã䜿ãæ¹ããããšããã°ã©ã ãã¯ã©ãã·ã¥ããããæå³ããªãåäœãåŒãèµ·ããããããå¯èœæ§ããããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãããããééããšãã®å¯ŸåŠæ³ã«ã€ããŠè§£èª¬ããŸãã
1. ãã€ã³ã¿ã®æªåæå
åé¡äŸ:
struct Node *p; // åæåããŠããªããã€ã³ã¿
p->data = 10; // ãšã©ãŒçºç
åé¡ã®åå :
ãã€ã³ã¿p
ã¯åæåãããŠããããäžå®ãªã¢ãã¬ã¹ãæããŠããŸãããã®ãããã¡ã¢ãªã¢ã¯ã»ã¹éåãçºçããŸãã
察åŠæ³:
ãã€ã³ã¿ã¯å¿ ãæå¹ãªã¡ã¢ãªãæãããã«åæåããŸãããã
struct Node *p = (struct Node *)malloc(sizeof(struct Node)); // ã¡ã¢ãªç¢ºä¿
p->data = 10; // æ£åžžã«åäœ
2. ã¡ã¢ãªãªãŒã¯
åé¡äŸ:
struct Node *p = (struct Node *)malloc(sizeof(struct Node));
// 䜿çšåŸãã¡ã¢ãªã解æŸããªã
åé¡ã®åå :
malloc
ã§ç¢ºä¿ããã¡ã¢ãªã解æŸãããªããšãããã°ã©ã çµäºæãŸã§ãã®ã¡ã¢ãªãå æããããŸãŸã«ãªããŸãã
察åŠæ³:
䜿çšåŸã¯å¿
ãfree
é¢æ°ã§ã¡ã¢ãªã解æŸããŸãããã
free(p);
ãŸããé£çµãªã¹ããªã©è€æ°ã®ããŒããåçã«ç¢ºä¿ããŠããå Žåã¯ããã¹ãŠã®ããŒãã解æŸããåŠçãè¿œå ããŸãã
struct Node *current = head;
struct Node *next;
while (current != NULL) {
next = current->next; // 次ã®ããŒããä¿æ
free(current); // çŸåšã®ããŒãã解æŸ
current = next; // 次ã®ããŒããžç§»å
}
3. ãã³ã°ãªã³ã°ãã€ã³ã¿
åé¡äŸ:
struct Node *p = (struct Node *)malloc(sizeof(struct Node));
free(p); // ã¡ã¢ãªè§£æŸ
p->data = 10; // 解æŸåŸã«ã¢ã¯ã»ã¹ â æªå®çŸ©åäœ
åé¡ã®åå :
ã¡ã¢ãªã解æŸãããåŸã«ããã®ã¡ã¢ãªãæããã€ã³ã¿ã䜿çšãããšããã³ã°ãªã³ã°ãã€ã³ã¿ãã«ãªããŸãã
察åŠæ³:
ã¡ã¢ãªã解æŸããåŸã¯ããã€ã³ã¿ãNULL
ã«èšå®ããŠãããŸãã
free(p);
p = NULL;
4. NULLãã€ã³ã¿ã®æäœ
åé¡äŸ:
struct Node *p = NULL;
p->data = 10; // NULLãã€ã³ã¿ãžã®ã¢ã¯ã»ã¹ â ãšã©ãŒ
åé¡ã®åå :
NULL
ãã€ã³ã¿ãåç
§ããããšãããšã»ã°ã¡ã³ããŒã·ã§ã³ãã©ã«ããçºçããŸãã
察åŠæ³:
ãã€ã³ã¿ã䜿ãåã«å¿
ãNULL
ãã§ãã¯ãè¡ããŸãããã
if (p != NULL) {
p->data = 10;
} else {
printf("ãã€ã³ã¿ãNULLã§ã\n");
}
ãããã°æ¹æ³
1. ãããã¬ã䜿çšãã
GDBãªã©ã®ãããã¬ã䜿çšããããšã§ãå®è¡æã®å€æ°ã®å€ãããã°ã©ã ã®ãããŒã確èªã§ããŸãã
gcc -g program.c -o program // ãããã°çšã³ã³ãã€ã«
gdb ./program
2. printf
ã«ãããããã°
ããŒã¿ã®å€ãã¢ãã¬ã¹ãåºåããããšã§ãããã°ã©ã ã®æåã確èªã§ããŸãã
printf("ã¢ãã¬ã¹: %p, å€: %d\n", (void *)p, *p);
3. ã¡ã¢ãªãªãŒã¯ã®æ€åº
valgrind
ã䜿çšãããšãã¡ã¢ãªãªãŒã¯ãæªåæåã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãæ€åºã§ããŸãã
valgrind --leak-check=full ./program
ãŸãšã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãCèšèªã«ãããæ§é äœãšãã€ã³ã¿ã®äœ¿çšæã«ããããééããšãã®ãããã°æ¹æ³ã«ã€ããŠè§£èª¬ããŸããã
- æªåæåãã€ã³ã¿
- ã¡ã¢ãªãªãŒã¯
- ãã³ã°ãªã³ã°ãã€ã³ã¿
- NULLãã€ã³ã¿ãžã®æäœ
ãããã®åé¡ã¯ããã°ã©ã ã«é倧ãªåœ±é¿ãäžããå¯èœæ§ãããããã察çãšæ€èšŒãè¡ããªããå®è£ ããããšãéèŠã§ãã
10. ãŸãšã
åŠãã ãã€ã³ãã®æ¯ãè¿ã
ãããŸã§ã®ã»ã¯ã·ã§ã³ã§ã¯ãCèšèªã«ãããæ§é äœãšãã€ã³ã¿ã«ã€ããŠåºç€ããå¿çšãŸã§è©³ãã解説ããŠããŸãããæ¬ã»ã¯ã·ã§ã³ã§ã¯ããã®å 容ãæ¯ãè¿ããªããåŠãã ãã€ã³ããæŽçããä»åŸã®å¿çšã«ã€ãªãããã³ããæäŸããŸãã
- æ§é äœã®åºæ¬
- è€æ°ã®ããŒã¿åãã²ãšãŸãšãã«ããŠç®¡çãã䟿å©ãªããŒã¿æ§é ã
- å®éã®ããŒã¿ç®¡çã«é©ããæ¹æ³ã§æ å ±ãæŽçã§ããã
- ãã€ã³ã¿ã®åºç€
- ã¡ã¢ãªã®ã¢ãã¬ã¹ãçŽæ¥æäœã§ãã匷åãªæ©èœã
- åçã¡ã¢ãªå²ãåœãŠãããŒã¿ã®åç §ã«åœ¹ç«ã€ã
- æ§é äœãšãã€ã³ã¿ã®çµã¿åãã
- æ§é äœãã€ã³ã¿ã«ãã£ãŠãããŒã¿ã®ç®¡çãæäœãå¹çåãããã
- åçã¡ã¢ãªå²ãåœãŠãšçµã¿åãããããšã§ãæè»ãªããŒã¿ç®¡çãå®çŸã
- é¢æ°ãšæ§é äœãã€ã³ã¿ã®é£æº
- ãã€ã³ã¿ãä»ããŠé¢æ°å ã§ããŒã¿ãçŽæ¥å€æŽã§ããã
- ã¡ã¢ãªå¹çãèæ ®ããæè»ãªããã°ã©ã èšèšãå¯èœã
- æ§é äœå ã§ã®ãã€ã³ã¿æŽ»çš
- åçã¡ã¢ãªç®¡çãå€æ¬¡å ããŒã¿ã®åŠçã«é©ããèšèšãå¯èœã
- è€éãªããŒã¿æ§é ïŒé£çµãªã¹ããè¡åïŒãå¹ççã«ç®¡çã§ããã
- é£çµãªã¹ãã®å®è£
- æ§é äœãšãã€ã³ã¿ãçµã¿åãããåçããŒã¿æ§é ã®æ§ç¯æ¹æ³ãåŠç¿ã
- èŠçŽ ã®è¿œå ã»åé€ãšãã£ãæäœãç°¡æœã«å®è£ å¯èœã
- ããããééããšãããã°æ¹æ³
- æªåæåãã€ã³ã¿ãã¡ã¢ãªãªãŒã¯ãªã©ã®åé¡ãç解ããé©åã«å¯ŸåŠããæ¹æ³ãç¿åŸã
- ãããã¬ãæ€èšŒããŒã«ã掻çšããŠå®å šãªããã°ã©ã ãäœæã
å®è·µãžã®å¿çš
åŠãã å 容ã掻çšããããšã§ã以äžã®ãããªããã°ã©ã ã«ææŠã§ããŸãã
- ãã¡ã€ã«ç®¡çã·ã¹ãã
- æ§é äœãšãã€ã³ã¿ã䜿ã£ãŠãã¡ã€ã«æ å ±ã管çããã·ã¹ãã ãäœæã
- åçããŒã¿æ§é ã®æ¡åŒµ
- é£çµãªã¹ããå¿çšããŠã¹ã¿ãã¯ããã¥ãŒãå®è£ ã
- ã²ãŒã éçºãã·ãã¥ã¬ãŒã·ã§ã³
- æ§é äœã§ãã£ã©ã¯ã¿ãŒæ å ±ãç¶æ ã管çããå¹ççãªã·ã¹ãã ãæ§ç¯ã
- ããŒã¿ããŒã¹ç®¡çã·ã¹ãã
- æ§é äœãšãã€ã³ã¿ã䜿ã£ãŠã¬ã³ãŒãã®è¿œå ã»åé€ã»æ€çŽ¢ãè¡ãããŒã¿ç®¡çã·ã¹ãã ãéçºã
次ã®ã¹ããã
- ã³ãŒãã®ã«ã¹ã¿ãã€ãº
- ãµã³ãã«ã³ãŒããåºã«ããŠãèªåã®ãããžã§ã¯ãã§å¿çšã§ããããã«ã«ã¹ã¿ãã€ãºããã
- ããé«åºŠãªããŒã¿æ§é ãžã®ææŠ
- äºéé£çµãªã¹ããæšæ§é ãã°ã©ããªã©ãããè€éãªããŒã¿æ§é ãåŠç¿ããã
- ã¢ã«ãŽãªãºã ãšçµã¿åããã
- æ§é äœããã€ã³ã¿ã䜿ã£ããœãŒããæ€çŽ¢ã¢ã«ãŽãªãºã ãå®è£ ããå®çšæ§ãé«ããã
- ãããã°ãšæé©åã¹ãã«ã®åäž
- ãããã¬ãã¡ã¢ãªè§£æããŒã«ã掻çšããã³ãŒãã®æé©åãšå®å šæ§ãé«ããã
æåŸã«
Cèšèªã®æ§é äœãšãã€ã³ã¿ã¯ãå¹ççã§æè»ãªããã°ã©ã èšèšãå¯èœã«ããéèŠãªæŠå¿µã§ããæ¬èšäºã§ã¯ãåºç€ããå¿çšãŸã§å¹ åºãåŠç¿ããå®è·µçãªã³ãŒãäŸãéããŠç解ãæ·±ããŸããã
ããããããã°ã©ã ãå®éã«äœæããªããå¿çšåãé«ããŠããããšã§ãããé«åºŠãªã·ã¹ãã éçºãã¢ã«ãŽãªãºã èšèšã«ã察å¿ã§ããããã«ãªãã§ãããã
ãã®ç¥èã掻ãããŠããããªãããã°ã©ãã³ã°ã¹ãã«åäžãç®æããŠãã ããïŒ