- 1 1. ã¯ããã«
- 2 2. ãã€ã³ã¿å€æ°ãšã¯äœãïŒ
- 3 3. ãã€ã³ã¿ã®åºæ¬æäœ
- 4 4. é åãšãã€ã³ã¿ã®é¢ä¿
- 5 5. 颿°ãšãã€ã³ã¿
- 6 6. ãã€ã³ã¿ã®å¿çšäŸ
- 7 7. ãããããšã©ãŒãšãã®å¯ŸåŠæ³
- 8 8. ãŸãšã
- 9 1. ã¯ããã«
- 10 2. ãã€ã³ã¿å€æ°ãšã¯äœãïŒ
- 11 3. ãã€ã³ã¿ã®åºæ¬æäœ
- 12 4. é åãšãã€ã³ã¿ã®é¢ä¿
- 13 5. 颿°ãšãã€ã³ã¿
- 14 6. ãã€ã³ã¿ã®å¿çšäŸ
- 15 7. ãããããšã©ãŒãšãã®å¯ŸåŠæ³
1. ã¯ããã«
CèšèªãåŠã¶ããã§é¿ããŠéããªãã®ãããã€ã³ã¿å€æ°ãã®çè§£ã§ããåå¿è ã«ãšã£ãŠã¯ããã¢ãã¬ã¹ããã鿥åç §ããšãã£ãæŠå¿µãé£è§£ã«æãããããããããŸãããããã€ã³ã¿ã¯Cèšèªã®æ ¹å¹¹ããªãéèŠãªèŠçŽ ã§ããã䜿ãããªããããã«ãªãããšã§ãããé«åºŠãªããã°ã©ãã³ã°ãå¯èœã«ãªããŸãã
æ¬èšäºã§ã¯ãããã€ã³ã¿å€æ°ãšã¯äœãïŒããšããåºç€ãããå®è·µçãªã³ãŒãäŸãããã«ã¯é åã颿°ãšã®é¢ä¿ãå¿çšçãªäœ¿ãæ¹ãŸã§ã段éçã«äžå¯§ã«è§£èª¬ããŠãããŸããå°éçšèªã®æå³ãåäœã®ã€ã¡ãŒãžãã€ãã¿ããããããå³è§£ããµã³ãã«ã³ãŒãã亀ããªããé²ããŠãããŸãã®ã§ãCèšèªã«ãŸã æ £ããŠããªãæ¹ã§ãå®å¿ããŠèªã¿é²ããŠããã ããŸãã
ãã€ã³ã¿ã¯ãæ £ããŠããŸãã°éåžžã«åŒ·åã§äŸ¿å©ãªæ©èœã§ããåçãªã¡ã¢ãªæäœãã颿°ãžã®å€ã®åãæž¡ããªã©ãããã°ã©ã ã®å¹ ã倧ããåºããŠãããŸãããã®èšäºãéããŠããã€ã³ã¿å€æ°ã«å¯Ÿããçè§£ãæ·±ããCèšèªã§ã®éçºã¹ãã«ãäžæ®µéé«ããŠããã ããã°å¹žãã§ãã
2. ãã€ã³ã¿å€æ°ãšã¯äœãïŒ
ãã€ã³ã¿å€æ°ã®åºæ¬æŠå¿µ
Cèšèªã«ããããã€ã³ã¿å€æ°ãšã¯ããã¡ã¢ãªäžã®ã¢ãã¬ã¹ãæ ŒçŽãã倿°ãã®ããšã§ããéåžžã®å€æ°ãããŒã¿ãã®ãã®ãæ ŒçŽããã®ã«å¯Ÿãããã€ã³ã¿ã¯å¥ã®å€æ°ãæ ŒçŽãããŠããå ŽæïŒã¢ãã¬ã¹ïŒãèšæ¶ããŸãã
ããšãã°ã次ã®ãããªã³ãŒããèããŠã¿ãŸãããã
int a = 10;
int *p = &a;
ãã®å Žåã倿°a
ã«ã¯å€10ãæ ŒçŽãããp
ã«ã¯a
ã®ã¢ãã¬ã¹ãæ ŒçŽãããŸãã*p
ãšæžãããšã§ãp
ãæãã¢ãã¬ã¹ã«ããå€ïŒãã®å Žåã¯10ïŒã鿥çã«åç
§ã§ããŸãã
ã¢ãã¬ã¹ãšã¡ã¢ãªã®é¢ä¿
ãã¹ãŠã®ããŒã¿ã¯ã³ã³ãã¥ãŒã¿ã®ã¡ã¢ãªäžã«æ ŒçŽãããŠããŸãããããŠãã¡ã¢ãªã«ã¯1ãã€ãããšã«ã¢ãã¬ã¹ãæ¯ãããŠããŸãããã€ã³ã¿ã¯ããã®ã¢ãã¬ã¹æ å ±ã䜿ã£ãŠãã©ã®ã¡ã¢ãªäœçœ®ãæäœãããããæå®ããããã®ææ®µã§ãã
ãã€ã³ã¿ã䜿ãããšã§ã以äžã®ãããªããšãå¯èœã«ãªããŸãã
- 颿°éã§å€æ°ã®äžèº«ãçŽæ¥æžãæãã
- é åã®èŠçŽ ãæè»ã«æäœãã
- ããŒãã¡ã¢ãªãçšããåçã¡ã¢ãªç®¡ç
ã€ãŸãããã€ã³ã¿ã¯Cèšèªã®æè»æ§ãšäœã¬ãã«å¶åŸ¡åãæ¯ããéèŠãªä»çµã¿ãªã®ã§ãã
ãã€ã³ã¿å€æ°ã®å®£èšãšåæå
ãã€ã³ã¿å€æ°ã¯ã察象ãšãªãããŒã¿åã«ã¢ã¹ã¿ãªã¹ã¯ïŒ*
ïŒãä»ããŠå®£èšããŸãã
int *p; // intåã®å€æ°ãæããã€ã³ã¿
char *c; // charåã®å€æ°ãæããã€ã³ã¿
ãããŠãéåžžã¯&
æŒç®åã䜿ã£ãŠãä»ã®å€æ°ã®ã¢ãã¬ã¹ã代å
¥ããŸãã
int a = 5;
int *p = &a; // aã®ã¢ãã¬ã¹ãpã«æ ŒçŽ
ããã§éèŠãªã®ã¯ãããã€ã³ã¿ã®åããšããã€ã³ã¿ãæãå€ã®åãã¯äžèŽããŠããå¿
èŠããããšããç¹ã§ããint
åãæããã€ã³ã¿ã«char
åã®ã¢ãã¬ã¹ãæ ŒçŽãããšãåäœãä¿èšŒãããªãå ŽåããããŸãã
3. ãã€ã³ã¿ã®åºæ¬æäœ
ãã€ã³ã¿å€æ°ã®åºæ¬ãçè§£ããããæ¬¡ã¯ãã©ããã£ãŠäœ¿ãã®ãïŒããå ·äœçã«èŠãŠãããŸããããããã§ã¯ããã€ã³ã¿æäœã«æ¬ ãããªãæŒç®åããå€ã®èªã¿æžãããã€ã³ã¿åå£«ã®æŒç®ãšãã£ãåºæ¬çãªæäœæ¹æ³ã玹ä»ããŸãã
ã¢ãã¬ã¹æŒç®åïŒ&ïŒãšéæ¥æŒç®åïŒ*ïŒ
ã¢ãã¬ã¹æŒç®åïŒ&ïŒ
&
ã¯ãã¢ãã¬ã¹æŒç®åããšåŒã°ãã倿°ã®ã¡ã¢ãªäžã®ã¢ãã¬ã¹ãååŸããããã«äœ¿ããŸãã
int a = 10;
int *p = &a;
ãã®äŸã§ã¯ã倿°a
ã®ã¢ãã¬ã¹ãp
ã«æ ŒçŽããŠããŸããp
ã«ã¯ãaãæ ŒçŽãããŠããå Žæããä¿åãããããã§ãã
鿥æŒç®åïŒ*ïŒ
*
ã¯ã鿥æŒç®åããŸãã¯ãåç
§æŒç®åããšåŒã°ãããã€ã³ã¿ãæããŠããã¢ãã¬ã¹ã®äžèº«ãåç
§ãŸãã¯å€æŽãããšãã«äœ¿ããŸãã
int a = 10;
int *p = &a;
printf("%d
", *p); // çµæ: 10
ãã®ããã«ã*p
ãšæžãããšã§ãa
ã®å€ïŒäžèº«ïŒã鿥çã«ååŸã§ããŸããéã«ã次ã®ããã«æžãã°å€ã®å€æŽãå¯èœã§ãã
*p = 20;
printf("%d
", a); // çµæ: 20
å€ã®ååŸãšæžãæãïŒãã€ã³ã¿ã®æŽ»çšäŸ
ãã€ã³ã¿ã䜿ãããšã§ãå¥ã®é¢æ°ãã倿°ã®å€ãçŽæ¥å€æŽããããšãã§ããŸãã以äžã¯ãã®åºæ¬äŸã§ãã
void updateValue(int *p) {
*p = 100;
}
int main() {
int num = 50;
updateValue(&num);
printf("%d
", num); // çµæ: 100
return 0;
}
ãã®ããã«ã颿°å ã§å€ãæŽæ°ããéã«ããã€ã³ã¿ã¯æŽ»èºããŸããCèšèªã§ã¯ã颿°ã«å€ãæž¡ããšãã¯åºæ¬çã«ã³ããŒïŒå€æž¡ãïŒãšãªããŸããããã€ã³ã¿ã䜿ãã°å ã®å€èªäœãæäœããããšãå¯èœã«ãªããŸãã
ãã€ã³ã¿ã®å ç®ãšæžç®
ãã€ã³ã¿ã¯ãå ç®ã»æžç®ãå¯èœã§ããããã¯é åãé£ç¶ããã¡ã¢ãªé åãæ±ãéã«éåžžã«äŸ¿å©ã§ãã
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d
", *p); // 10
p++;
printf("%d
", *p); // 20
ããã§éèŠãªã®ã¯ããp++
ããšãããšã次ã®intå倿°ã®ã¢ãã¬ã¹ãžç§»åãããšããç¹ã§ããintåã4ãã€ããªããp++
ã¯ã¢ãã¬ã¹çã«ã¯ã+4ããããŸãã
ãã®ããã«ããã€ã³ã¿ã®åºæ¬æäœãçè§£ããããšã¯ãCèšèªã«ãããã¡ã¢ãªæäœã®åºç€ãç¯ãç¬¬äžæ©ã§ããæ¬¡ç« ã§ã¯ããã€ã³ã¿ãšé åã®é¢ä¿ã«ã€ããŠããã«è©³ããèŠãŠãããŸãããã
4. é åãšãã€ã³ã¿ã®é¢ä¿
Cèšèªã«ãããŠãé åãšãã€ã³ã¿ã¯éåžžã«å¯æ¥ãªé¢ä¿ã«ãããŸããåå¿è ã«ãšã£ãŠã¯æ··ä¹±ãããããã€ã³ãã§ããããŸããããã®é¢ä¿ãçè§£ããããšã§ãããæè»ãã€å¹ççãªé åæäœãå¯èœã«ãªããŸãã
é ååã¯ãã€ã³ã¿ã®ããã«æ±ãã
Cèšèªã§ã¯ãé ååã¯å é èŠçŽ ã®ã¢ãã¬ã¹ãæããã€ã³ã¿ãšããŠæ±ãããŸããããšãã°æ¬¡ã®ãããªã³ãŒããèŠãŠã¿ãŸãããã
int arr[3] = {10, 20, 30};
printf("%d
", *arr); // çµæ: 10
ãã®ãšããarr
ã¯&arr[0]
ãšåãã¢ãã¬ã¹ãæããŠããã*arr
ã¯é
åã®æåã®èŠçŽ ïŒarr[0]
ïŒãæå³ããŸãã
ãã€ã³ã¿ã䜿ã£ãé åã®ã¢ã¯ã»ã¹
é åã¯ã€ã³ããã¯ã¹ã§ã¢ã¯ã»ã¹ã§ããŸããããã€ã³ã¿ã䜿ã£ãŠãåæ§ã®æäœãå¯èœã§ãã
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d
", p[1]); // çµæ: 20
ããã§ã¯ãp[1]
ã¯*(p + 1)
ãšåãæå³ã«ãªããŸããã€ãŸãããã€ã³ã¿ã䜿ãã°æ¬¡ã®ããã«ãæžããŸãã
printf("%d
", *(arr + 2)); // çµæ: 30
ãã®ããã«ãã€ã³ããã¯ã¹è¡šèšãšãã€ã³ã¿æŒç®ã¯æ¬è³ªçã«åãããšãããŠããŸãã
ãã€ã³ã¿æŒç®ãšé åã€ã³ããã¯ã¹ã®éã
é åãšãã€ã³ã¿ã¯äŒŒãŠããŸãããå®å šã«åãã§ã¯ãªãããšã«ã泚æãå¿ èŠã§ãã
1. ãµã€ãºã®ååŸ
é
ååã䜿ããšããã®ãµã€ãºãsizeof
ã§ååŸã§ããŸããããã€ã³ã¿ã«ä»£å
¥ããæç¹ã§ãµã€ãºã¯å€±ãããŸãã
int arr[5];
int *p = arr;
printf("%zu
", sizeof(arr)); // çµæ: 20ïŒ5Ã4ãã€ãïŒ
printf("%zu
", sizeof(p)); // çµæ: 8ïŒ64bitç°å¢ã§ã¯ãã€ã³ã¿ã¯8ãã€ãïŒ
2. æžãæãã®å¯åŠ
é ååã¯å®æ°ãã€ã³ã¿ã®ãããªãã®ã§ãããä»£å ¥ã«ãã倿Žã¯ã§ããŸããã
int arr[3];
int *p = arr;
p = p + 1; // OK
arr = arr + 1; // ãšã©ãŒïŒé
ååã¯å代å
¥äžå¯ïŒ
ãã€ã³ã¿ãšé åã䜿ãããªãã¡ãªãã
- ãã€ã³ã¿ã䜿ãã°ãã¡ã¢ãªç©ºéãæè»ã«æäœã§ãã
- é ååŠçãé«éã»å¹ççã«ãªãïŒã€ã³ããã¯ã¹ããããã€ã³ã¿æŒç®ã®æ¹ããããã«éãå ŽåãïŒ
- 颿°ã«é åãæž¡ãéã宿 ã§ã¯ãªãå é ã¢ãã¬ã¹ã®ã¿æž¡ãããã®ã§ããã€ã³ã¿ãšããŠã®ç¥èã¯å¿ é
5. 颿°ãšãã€ã³ã¿
Cèšèªã§ã¯ã颿°ã«å€æ°ãæž¡ãéã倿ž¡ãïŒcall by valueïŒãåºæ¬ã§ãããã®ããã颿°å ã§åŒæ°ã倿ŽããŠããå ã®å€æ°ã«ã¯åœ±é¿ããŸããããããããã€ã³ã¿ã䜿ãããšã§é¢æ°ããå ã®å€æ°ã®å€ãçŽæ¥æäœããããšãå¯èœã«ãªããŸãã
ãã®ç« ã§ã¯ã颿°ãšãã€ã³ã¿ã®é¢ä¿ãå€ã®æžãæãæ¹æ³ã颿°ãã€ã³ã¿ã®åºæ¬ãªã©ã颿°ã«ããããã€ã³ã¿ã®äœ¿ãæ¹ã解説ããŸãã
ãã€ã³ã¿ã䜿ã£ãå€ã®æžãæã
ãŸãã颿°å ãã倿°ã®å€ã倿Žãããå Žåããã€ã³ã¿ã䜿ãå¿ èŠããããŸãã
äŸïŒãã€ã³ã¿ãªãã®å Žå
void update(int x) {
x = 100;
}
int main() {
int a = 10;
update(a);
printf("%d
", a); // çµæ: 10ïŒå€æŽãããªãïŒ
return 0;
}
ãã®å Žåã颿°ã«ã¯a
ã®ã³ããŒãæž¡ãããŠãããããa
èªäœã¯å€æŽãããŸããã
äŸïŒãã€ã³ã¿ã䜿ãå Žå
void update(int *x) {
*x = 100;
}
int main() {
int a = 10;
update(&a);
printf("%d
", a); // çµæ: 100ïŒå€æŽãããïŒ
return 0;
}
ãã®ããã«ã倿°ã®ã¢ãã¬ã¹ã颿°ã«æž¡ãããšã§ãå ã®å€ã倿Žããããšãã§ããŸããããã¯ãåç §æž¡ãïŒcall by referenceïŒãã®ãã¯ããã¯ãšããŠåºã䜿ãããŠããŸãã
é åãšé¢æ°ã®é¢ä¿
Cèšèªã§ã¯ãé åã颿°ã«æž¡ããšèªåçã«ãã€ã³ã¿ãšããŠæ±ãããŸããã€ãŸããé åã®å é èŠçŽ ã®ã¢ãã¬ã¹ã颿°ã«æž¡ãããããã颿°å ã§å 容ã®å€æŽãå¯èœã§ãã
void setValues(int *arr, int size) {
for (int i = 0; i < size; i++) {
arr[i] = i * 10;
}
}
int main() {
int nums[3];
setValues(nums, 3);
printf("%d
", nums[1]); // çµæ: 10
return 0;
}
ãã®äŸã®ããã«ãé ååããã®ãŸãŸæž¡ãã ãã§é¢æ°å ããå 容ã倿Žã§ããŸãã
颿°ãã€ã³ã¿ã®åºæ¬
Cèšèªã§ã¯ã颿°ã®ã¢ãã¬ã¹ã倿°ã«æ ŒçŽããŠåŒã³åºãããšãã§ããŸããããã颿°ãã€ã³ã¿ã§ãã
宣èšãšäœ¿çšäŸïŒ
int add(int a, int b) {
return a + b;
}
int main() {
int (*funcPtr)(int, int); // intåãè¿ããintåã2ã€åŒæ°ã«åã颿°ãã€ã³ã¿
funcPtr = add;
int result = funcPtr(3, 4);
printf("%d
", result); // çµæ: 7
return 0;
}
颿°ãã€ã³ã¿ã¯ãåçã«é¢æ°ãéžãã§å®è¡ããããšãããã³ãŒã«ããã¯é¢æ°ã®å®è£ ãªã©ã«äœ¿ãããŸãã颿°åã ãã§ã颿°ã®ã¢ãã¬ã¹ãååŸã§ãããããæè»ãªããã°ã©ãã³ã°ãå¯èœã§ãã
å®è·µçãªäœ¿çšå Žé¢
- é åã®äžŠã¹æ¿ãïŒãœãŒãïŒã«ãããŠãæ¯èŒé¢æ°ããã€ã³ã¿ã§æž¡ã
- ã¡ãã¥ãŒéžæåããã°ã©ã ã§ãéžæè¢ããšã«å®è¡ãã颿°ã颿°ãã€ã³ã¿ã§ç®¡ç
- ã€ãã³ãé§åååŠçãã³ãŒã«ããã¯é¢æ°ã®å®è£ ïŒGUIãçµã¿èŸŒã¿ãã²ãŒã éçºãªã©ïŒ
6. ãã€ã³ã¿ã®å¿çšäŸ
ãã€ã³ã¿ã®åºæ¬çãªäœ¿ãæ¹ãçè§£ããããæ¬¡ã¯å¿çšçãªæŽ»çšæ¹æ³ãåŠãã§ãããŸããããCèšèªã®ãã€ã³ã¿ã¯ãåçãªã¡ã¢ãªæäœãé«åºŠãªããŒã¿æ§é ã®å®è£ ã«äžå¯æ¬ ã§ãããã®ç« ã§ã¯ãå®åã§ãé »ç¹ã«äœ¿ãããå¿çšçãªãã¯ããã¯ã3ã€ç޹ä»ããŸãã
åçã¡ã¢ãªç¢ºä¿ïŒmalloc
ãšfree
ïŒ
Cèšèªã§ã¯ãå®è¡æã«å¿
èŠãªã¡ã¢ãªãåçã«ç¢ºä¿ããããšãã§ããŸãããããå¯èœã«ããã®ããæšæºã©ã€ãã©ãªã®malloc
颿°ã§ãã確ä¿ãããã¡ã¢ãªã¯ãã€ã³ã¿ã§åç
§ããã䜿ãçµãã£ããfree
ã§è§£æŸããå¿
èŠããããŸãã
äŸïŒæŽæ°ãåçã«ç¢ºä¿ãã
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *)malloc(sizeof(int)); // intå1ã€åã®ã¡ã¢ãªã確ä¿
if (p == NULL) {
printf("ã¡ã¢ãªç¢ºä¿ã«å€±æããŸãã
");
return 1;
}
*p = 123;
printf("%d
", *p); // çµæ: 123
free(p); // ã¡ã¢ãªãè§£æŸ
return 0;
}
泚æç¹ïŒ
malloc
ã¯ç¢ºä¿ãããã¡ã¢ãªã®å é ã¢ãã¬ã¹ãè¿ã- æ»ãå€ã¯å¿ ãNULLãã§ãã¯
- ã¡ã¢ãªã¯äœ¿ãçµãã£ãã
free
ã§å¿ ãè§£æŸ
ãã®ããã«ãå¿ èŠãªã¿ã€ãã³ã°ã§å¿ èŠãªã ãã¡ã¢ãªã確ä¿ã§ããã®ãããã€ã³ã¿ã䜿ã£ãåçã¡ã¢ãªç®¡çã®é åã§ãã
ãã€ã³ã¿ã®ãã€ã³ã¿ïŒäºéãã€ã³ã¿ïŒ
ãã€ã³ã¿ã®ã¢ãã¬ã¹ãä¿æãããã€ã³ã¿ãã€ãŸãããã€ã³ã¿ã®ãã€ã³ã¿ããCèšèªã§ã¯ãã䜿ãããŸããç¹ã«ã颿°å ã§ãã€ã³ã¿ã倿Žãããå Žåãã2次å é åã®æäœãªã©ã§æŽ»èºããŸãã
äŸïŒé¢æ°å ã§ãã€ã³ã¿ãåæåãã
void allocate(int **pp) {
*pp = (int *)malloc(sizeof(int));
if (*pp != NULL) {
**pp = 42;
}
}
int main() {
int *p = NULL;
allocate(&p);
printf("%d
", *p); // çµæ: 42
free(p);
return 0;
}
ãã䜿ãããå Žé¢ïŒ
- é åã®é åïŒ2次å é åïŒ
- æ§é äœã®äžã§å¯å€æ°ã®é åãæã€ãšã
- è€æ°ã®æååãæ±ãïŒchar *argv ãªã©ïŒ
颿°ãã€ã³ã¿ãšé åã®çµã¿åãã
颿°ãã€ã³ã¿ãé åãšããŠä¿æããç¶æ³ã«å¿ããŠåçã«é¢æ°ãåãæ¿ããŠåŒã³åºããšãã£ãé«åºŠãªãã¯ããã¯ããCèšèªã§ã¯äžè¬çã§ãã
äŸïŒç°¡åãªã¡ãã¥ãŒéžæ
#include <stdio.h>
void hello() { printf("Hello
"); }
void bye() { printf("Goodbye
"); }
int main() {
void (*funcs[2])() = {hello, bye};
int choice = 0;
printf("0: hello, 1: bye > ");
scanf("%d", &choice);
if (choice >= 0 && choice < 2) {
funcs[choice](); // 颿°åŒã³åºã
}
return 0;
}
ãã®ãããªèšèšã¯ãç¶æ 管çãã€ãã³ãé§ååããã°ã©ã ã§ã圹ç«ã¡ãŸãã
ãã€ã³ã¿ã䜿ã£ãå¿çšçãªãã¯ããã¯ã¯ãåãªãèšè¿°å以äžã«ãã¡ã¢ãªãå®è¡å¶åŸ¡ãæèããèšèšåãæ±ããããŸãããããã䜿ãããªããããã«ãªãã°ãCèšèªã®åãæå€§éã«åŒãåºãããšãã§ããããã«ãªããŸãã

7. ãããããšã©ãŒãšãã®å¯ŸåŠæ³
ãã€ã³ã¿ã¯éåžžã«åŒ·åãªæ©èœã§ãããæ±ããééãããšãã°ãã»ãã¥ãªãã£ããŒã«ã®åå ã«ããªããŸãããã®ç« ã§ã¯ãCèšèªã«ããããã€ã³ã¿ã®äœ¿çšæã«ããçºçãããšã©ãŒãšããããé²ãããã®å¯Ÿçã«ã€ããŠè§£èª¬ããŸãã
æªåæåãã€ã³ã¿ã®äœ¿çš
æãåºæ¬çã§ãããªããå±éºãªã®ããæªåæåã®ãã€ã³ã¿ã䜿çšããã±ãŒã¹ã§ãããã€ã³ã¿ã¯å®£èšããã ãã§ã¯æå¹ãªã¢ãã¬ã¹ãæããŠããŸããã
æªãäŸïŒ
int *p;
*p = 10; // æªå®çŸ©åäœïŒpã¯ã©ããæããŠããªã
察çïŒ
- ãã€ã³ã¿ã¯å¿ ãåæåããŠãã䜿ã
- 䜿çšåã«
NULL
ãã§ãã¯ãè¡ã
int *p = NULL;
// 䜿çšåã«ã¡ã¢ãªç¢ºä¿ãŸãã¯æå¹ãªã¢ãã¬ã¹ã代å
¥
NULLãã€ã³ã¿ã®éåç §
ãã€ã³ã¿ãNULL
ãæããŠããç¶æ
ã§*p
ãè¡ããšãããã°ã©ã ã¯ã¯ã©ãã·ã¥ããŸããããã¯éåžžã«äžè¬çãªãã°ã§ãã
äŸïŒ
int *p = NULL;
printf("%d
", *p); // å®è¡æãšã©ãŒïŒã»ã°ã¡ã³ããŒã·ã§ã³ãã©ãŒã«ããªã©ïŒ
察çïŒ
- ãã€ã³ã¿ã
NULL
ã§ãªãã確èªããŠãã䜿çš
if (p != NULL) {
printf("%d
", *p);
}
ã¡ã¢ãªãªãŒã¯
åçã«ç¢ºä¿ããã¡ã¢ãªãfree
ãå¿ãããšãã¡ã¢ãªãè§£æŸãããã«èç©ããããã¡ã¢ãªãªãŒã¯ããçºçããŸããé·æéåäœããããã°ã©ã ãåã蟌ã¿ç³»ã§ã¯èŽåœçã§ãã
äŸïŒ
int *p = (int *)malloc(sizeof(int));
// åŠçãçµããŠãfreeããªã â ã¡ã¢ãªãªãŒã¯
察çïŒ
- 䜿çšãçµãã£ããå¿
ã
free
ãã malloc
ãšfree
ã®å¯Ÿå¿ãæèãã- éçºäžã¯ã¡ã¢ãªãªãŒã¯æ€åºããŒã«ïŒäŸïŒValgrindïŒã掻çš
ãã³ã°ãªã³ã°ãã€ã³ã¿
free
ããåŸã®ã¡ã¢ãªãæããŠãããã€ã³ã¿ã¯âãã³ã°ãªã³ã°ãã€ã³ã¿âãšåŒã°ããåå©çšãããšæªå®çŸ©åäœãåŒãèµ·ãããŸãã
äŸïŒ
int *p = (int *)malloc(sizeof(int));
free(p);
*p = 123; // ãšã©ãŒïŒãã§ã«è§£æŸãããã¡ã¢ãªã«ã¢ã¯ã»ã¹
察çïŒ
free
ã®åŸã¯å¿ ãNULLãä»£å ¥ããŠç¡å¹åãã
free(p);
p = NULL;
é åå€ã¢ã¯ã»ã¹
ãã€ã³ã¿ã䜿ã£ãã€ã³ããã¯ã¹æŒç®ã§ãæå³ããé åã®å¢çãè¶ ããŠããŸãããšããããŸãããããéåžžã«å±éºã§ããã°ãè匱æ§ã®åå ãšãªããŸãã
äŸïŒ
int arr[3] = {1, 2, 3};
printf("%d
", *(arr + 3)); // æªå®çŸ©åäœïŒarr[3]ã¯ååšããªãïŒ
察çïŒ
- åžžã«æå¹ãªç¯å²å ã§ã¢ã¯ã»ã¹ããŠãããã確èª
- ã«ãŒãåŠçã§ã¯ãå¢çãã§ãã¯ãã培åºãã
åããã€ã³ã¿ãäºéã«è§£æŸãã
åãã¡ã¢ãªã¢ãã¬ã¹ãfree
ããæäœã2åè¡ããšãããã°ã©ã ãã¯ã©ãã·ã¥ããå±éºããããŸãã
察çïŒ
free
åŸã®ãã€ã³ã¿ãNULLã«ããããšã§ãäºéè§£æŸã鲿¢
free(p);
p = NULL;
ãããã®ãšã©ãŒã¯ãåºæ¬ãå®ã£ãŠäžå¯§ã«ã³ãŒãã£ã³ã°ããããšã§é²æ¢å¯èœã§ããç¹ã«åå¿è ã®ãã¡ã¯ããåæåããNULLãã§ãã¯ããfreeã®åŸ¹åºããã«ãŒã«ãšããŠå®ãããšãããã°ã®ãªãã³ãŒãã«ã€ãªãããŸãã
8. ãŸãšã
Cèšèªã«ãããŠããã€ã³ã¿å€æ°ã¯æãåºæ¬ã§ãããªããå¥¥ãæ·±ãéèŠãªèŠçŽ ã§ããæ¬èšäºã§ã¯ãããã€ã³ã¿ãšã¯äœãïŒããšããåºç€ãããé åã»é¢æ°ã»ã¡ã¢ãªç®¡çã»é¢æ°ãã€ã³ã¿ãšãã£ãå¿çšäŸãŸã§ã段éçã«è§£èª¬ããŠããŸããã
åŠãã ãã€ã³ãã®æ¯ãè¿ã
- ãã€ã³ã¿å€æ°ã¯ãããŒã¿ã®ã¢ãã¬ã¹ãæ ŒçŽãã倿°ã§ããã
*
ïŒéæ¥æŒç®åïŒãš&
ïŒã¢ãã¬ã¹æŒç®åïŒã«ãã£ãŠæäœããã - é åãšãã€ã³ã¿ã¯å¯æ¥ã«é¢é£ããŠãããé ååã¯å é ã¢ãã¬ã¹ã瀺ããã€ã³ã¿ãšããŠæ±ãã
- 颿°ãšãã€ã³ã¿ãçµã¿åãããã°ã颿°å ã§å€æ°ãçŽæ¥æäœãããåç §æž¡ãããå¯èœã«ãªãã颿°ãã€ã³ã¿ã䜿ãããšã§æè»ãªé¢æ°åŒã³åºããå®çŸã§ãã
- åçã¡ã¢ãªç®¡çïŒmalloc/freeïŒãäºéãã€ã³ã¿ãšãã£ããã¯ããã¯ã¯ãããå®è·µçã§æè»ãªããã°ã©ã èšèšãæ¯ãã
- äžæ¹ã§ãæªåæåãã€ã³ã¿ã»NULLåç §ã»ã¡ã¢ãªãªãŒã¯ã»ãã³ã°ãªã³ã°ãã€ã³ã¿ãªã©ããã€ã³ã¿ç¹æã®ãšã©ãŒãå€ããæ éãªæ±ããæ±ãããã
åå¿è ãžã®ã¢ããã€ã¹
ãã€ã³ã¿ã¯ãé£ããããæãããšãã£ãå°è±¡ãæãããã¡ã§ãããããã¯ãã©ãã¯ããã¯ã¹ã®ãŸãŸäœ¿ã£ãŠããŸã£ãŠããããã§ããã¢ãã¬ã¹ã®æå³ãã¡ã¢ãªã®ä»çµã¿ããã£ããçè§£ããããšã§ãäžå®ã¯èªä¿¡ãžãšå€ãããŸãã
以äžã®ãããªæé ã§åŠã³ãå®çããããšããã§ãããïŒ
- ãµã³ãã«ã³ãŒããçŽãšå³ã§ææžãã§è¿œã£ãŠã¿ã
printf
ã§ã¢ãã¬ã¹ãå€ãå¯èŠåããŠç¢ºèªããValgrind
ãªã©ã®ã¡ã¢ãªãã§ãã¯ããŒã«ã掻çšãã- å°ããªãã€ã³ã¿æäœã®ç·Žç¿ããã°ã©ã ãè€æ°æžããŠã¿ã
次ã®ã¹ããããž
æ¬èšäºã§ç޹ä»ããå 容ã¯ãCèšèªã®ãã€ã³ã¿ã«é¢ããåºç€ããäžçŽã¬ãã«ãŸã§ãã«ããŒããŠããŸããä»åŸããã«çè§£ãæ·±ããããã«ã¯ã以äžã®ãããªããŒãã«é²ããšããã§ãããã
- æ§é äœãšãã€ã³ã¿
- ãã€ã³ã¿ã䜿ã£ãæååæäœ
- ãã¡ã€ã«å ¥åºåãšãã€ã³ã¿
- 倿¬¡å é åã®æäœ
- 颿°ãã€ã³ã¿ãçšããã³ãŒã«ããã¯èšèš
ãã€ã³ã¿ãçè§£ããããšã§ãCèšèªã®æ¬åœã®é¢çœããå匷ãã宿ã§ããããã«ãªããŸããæåã¯æžæãããšããããããããŸããããå°ããã€ç¢ºå®ã«çè§£ãç©ã¿éããŠãããŸãããããã®èšäºããã®äžå©ãšãªãã°å¹žãã§ãã
1. ã¯ããã«
CèšèªãåŠã¶ããã§é¿ããŠéããªãã®ãããã€ã³ã¿å€æ°ãã®çè§£ã§ããåå¿è ã«ãšã£ãŠã¯ããã¢ãã¬ã¹ããã鿥åç §ããšãã£ãæŠå¿µãé£è§£ã«æãããããããããŸãããããã€ã³ã¿ã¯Cèšèªã®æ ¹å¹¹ããªãéèŠãªèŠçŽ ã§ããã䜿ãããªããããã«ãªãããšã§ãããé«åºŠãªããã°ã©ãã³ã°ãå¯èœã«ãªããŸãã
æ¬èšäºã§ã¯ãããã€ã³ã¿å€æ°ãšã¯äœãïŒããšããåºç€ãããå®è·µçãªã³ãŒãäŸãããã«ã¯é åã颿°ãšã®é¢ä¿ãå¿çšçãªäœ¿ãæ¹ãŸã§ã段éçã«äžå¯§ã«è§£èª¬ããŠãããŸããå°éçšèªã®æå³ãåäœã®ã€ã¡ãŒãžãã€ãã¿ããããããå³è§£ããµã³ãã«ã³ãŒãã亀ããªããé²ããŠãããŸãã®ã§ãCèšèªã«ãŸã æ £ããŠããªãæ¹ã§ãå®å¿ããŠèªã¿é²ããŠããã ããŸãã
ãã€ã³ã¿ã¯ãæ £ããŠããŸãã°éåžžã«åŒ·åã§äŸ¿å©ãªæ©èœã§ããåçãªã¡ã¢ãªæäœãã颿°ãžã®å€ã®åãæž¡ããªã©ãããã°ã©ã ã®å¹ ã倧ããåºããŠãããŸãããã®èšäºãéããŠããã€ã³ã¿å€æ°ã«å¯Ÿããçè§£ãæ·±ããCèšèªã§ã®éçºã¹ãã«ãäžæ®µéé«ããŠããã ããã°å¹žãã§ãã
2. ãã€ã³ã¿å€æ°ãšã¯äœãïŒ
ãã€ã³ã¿å€æ°ã®åºæ¬æŠå¿µ
Cèšèªã«ããããã€ã³ã¿å€æ°ãšã¯ããã¡ã¢ãªäžã®ã¢ãã¬ã¹ãæ ŒçŽãã倿°ãã®ããšã§ããéåžžã®å€æ°ãããŒã¿ãã®ãã®ãæ ŒçŽããã®ã«å¯Ÿãããã€ã³ã¿ã¯å¥ã®å€æ°ãæ ŒçŽãããŠããå ŽæïŒã¢ãã¬ã¹ïŒãèšæ¶ããŸãã
ããšãã°ã次ã®ãããªã³ãŒããèããŠã¿ãŸãããã
int a = 10;
int *p = &a;
ãã®å Žåã倿°a
ã«ã¯å€10ãæ ŒçŽãããp
ã«ã¯a
ã®ã¢ãã¬ã¹ãæ ŒçŽãããŸãã*p
ãšæžãããšã§ãp
ãæãã¢ãã¬ã¹ã«ããå€ïŒãã®å Žåã¯10ïŒã鿥çã«åç
§ã§ããŸãã
ã¢ãã¬ã¹ãšã¡ã¢ãªã®é¢ä¿
ãã¹ãŠã®ããŒã¿ã¯ã³ã³ãã¥ãŒã¿ã®ã¡ã¢ãªäžã«æ ŒçŽãããŠããŸãããããŠãã¡ã¢ãªã«ã¯1ãã€ãããšã«ã¢ãã¬ã¹ãæ¯ãããŠããŸãããã€ã³ã¿ã¯ããã®ã¢ãã¬ã¹æ å ±ã䜿ã£ãŠãã©ã®ã¡ã¢ãªäœçœ®ãæäœãããããæå®ããããã®ææ®µã§ãã
ãã€ã³ã¿ã䜿ãããšã§ã以äžã®ãããªããšãå¯èœã«ãªããŸãã
- 颿°éã§å€æ°ã®äžèº«ãçŽæ¥æžãæãã
- é åã®èŠçŽ ãæè»ã«æäœãã
- ããŒãã¡ã¢ãªãçšããåçã¡ã¢ãªç®¡ç
ã€ãŸãããã€ã³ã¿ã¯Cèšèªã®æè»æ§ãšäœã¬ãã«å¶åŸ¡åãæ¯ããéèŠãªä»çµã¿ãªã®ã§ãã
ãã€ã³ã¿å€æ°ã®å®£èšãšåæå
ãã€ã³ã¿å€æ°ã¯ã察象ãšãªãããŒã¿åã«ã¢ã¹ã¿ãªã¹ã¯ïŒ*
ïŒãä»ããŠå®£èšããŸãã
int *p; // intåã®å€æ°ãæããã€ã³ã¿
char *c; // charåã®å€æ°ãæããã€ã³ã¿
ãããŠãéåžžã¯&
æŒç®åã䜿ã£ãŠãä»ã®å€æ°ã®ã¢ãã¬ã¹ã代å
¥ããŸãã
int a = 5;
int *p = &a; // aã®ã¢ãã¬ã¹ãpã«æ ŒçŽ
ããã§éèŠãªã®ã¯ãããã€ã³ã¿ã®åããšããã€ã³ã¿ãæãå€ã®åãã¯äžèŽããŠããå¿
èŠããããšããç¹ã§ããint
åãæããã€ã³ã¿ã«char
åã®ã¢ãã¬ã¹ãæ ŒçŽãããšãåäœãä¿èšŒãããªãå ŽåããããŸãã
3. ãã€ã³ã¿ã®åºæ¬æäœ
ãã€ã³ã¿å€æ°ã®åºæ¬ãçè§£ããããæ¬¡ã¯ãã©ããã£ãŠäœ¿ãã®ãïŒããå ·äœçã«èŠãŠãããŸããããããã§ã¯ããã€ã³ã¿æäœã«æ¬ ãããªãæŒç®åããå€ã®èªã¿æžãããã€ã³ã¿åå£«ã®æŒç®ãšãã£ãåºæ¬çãªæäœæ¹æ³ã玹ä»ããŸãã
ã¢ãã¬ã¹æŒç®åïŒ&ïŒãšéæ¥æŒç®åïŒ*ïŒ
ã¢ãã¬ã¹æŒç®åïŒ&ïŒ
&
ã¯ãã¢ãã¬ã¹æŒç®åããšåŒã°ãã倿°ã®ã¡ã¢ãªäžã®ã¢ãã¬ã¹ãååŸããããã«äœ¿ããŸãã
int a = 10;
int *p = &a;
ãã®äŸã§ã¯ã倿°a
ã®ã¢ãã¬ã¹ãp
ã«æ ŒçŽããŠããŸããp
ã«ã¯ãaãæ ŒçŽãããŠããå Žæããä¿åãããããã§ãã
鿥æŒç®åïŒ*ïŒ
*
ã¯ã鿥æŒç®åããŸãã¯ãåç
§æŒç®åããšåŒã°ãããã€ã³ã¿ãæããŠããã¢ãã¬ã¹ã®äžèº«ãåç
§ãŸãã¯å€æŽãããšãã«äœ¿ããŸãã
int a = 10;
int *p = &a;
printf("%d
", *p); // çµæ: 10
ãã®ããã«ã*p
ãšæžãããšã§ãa
ã®å€ïŒäžèº«ïŒã鿥çã«ååŸã§ããŸããéã«ã次ã®ããã«æžãã°å€ã®å€æŽãå¯èœã§ãã
*p = 20;
printf("%d
", a); // çµæ: 20
å€ã®ååŸãšæžãæãïŒãã€ã³ã¿ã®æŽ»çšäŸ
ãã€ã³ã¿ã䜿ãããšã§ãå¥ã®é¢æ°ãã倿°ã®å€ãçŽæ¥å€æŽããããšãã§ããŸãã以äžã¯ãã®åºæ¬äŸã§ãã
void updateValue(int *p) {
*p = 100;
}
int main() {
int num = 50;
updateValue(&num);
printf("%d
", num); // çµæ: 100
return 0;
}
ãã®ããã«ã颿°å ã§å€ãæŽæ°ããéã«ããã€ã³ã¿ã¯æŽ»èºããŸããCèšèªã§ã¯ã颿°ã«å€ãæž¡ããšãã¯åºæ¬çã«ã³ããŒïŒå€æž¡ãïŒãšãªããŸããããã€ã³ã¿ã䜿ãã°å ã®å€èªäœãæäœããããšãå¯èœã«ãªããŸãã
ãã€ã³ã¿ã®å ç®ãšæžç®
ãã€ã³ã¿ã¯ãå ç®ã»æžç®ãå¯èœã§ããããã¯é åãé£ç¶ããã¡ã¢ãªé åãæ±ãéã«éåžžã«äŸ¿å©ã§ãã
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d
", *p); // 10
p++;
printf("%d
", *p); // 20
ããã§éèŠãªã®ã¯ããp++
ããšãããšã次ã®intå倿°ã®ã¢ãã¬ã¹ãžç§»åãããšããç¹ã§ããintåã4ãã€ããªããp++
ã¯ã¢ãã¬ã¹çã«ã¯ã+4ããããŸãã
ãã®ããã«ããã€ã³ã¿ã®åºæ¬æäœãçè§£ããããšã¯ãCèšèªã«ãããã¡ã¢ãªæäœã®åºç€ãç¯ãç¬¬äžæ©ã§ããæ¬¡ç« ã§ã¯ããã€ã³ã¿ãšé åã®é¢ä¿ã«ã€ããŠããã«è©³ããèŠãŠãããŸãããã
4. é åãšãã€ã³ã¿ã®é¢ä¿
Cèšèªã«ãããŠãé åãšãã€ã³ã¿ã¯éåžžã«å¯æ¥ãªé¢ä¿ã«ãããŸããåå¿è ã«ãšã£ãŠã¯æ··ä¹±ãããããã€ã³ãã§ããããŸããããã®é¢ä¿ãçè§£ããããšã§ãããæè»ãã€å¹ççãªé åæäœãå¯èœã«ãªããŸãã
é ååã¯ãã€ã³ã¿ã®ããã«æ±ãã
Cèšèªã§ã¯ãé ååã¯å é èŠçŽ ã®ã¢ãã¬ã¹ãæããã€ã³ã¿ãšããŠæ±ãããŸããããšãã°æ¬¡ã®ãããªã³ãŒããèŠãŠã¿ãŸãããã
int arr[3] = {10, 20, 30};
printf("%d
", *arr); // çµæ: 10
ãã®ãšããarr
ã¯&arr[0]
ãšåãã¢ãã¬ã¹ãæããŠããã*arr
ã¯é
åã®æåã®èŠçŽ ïŒarr[0]
ïŒãæå³ããŸãã
ãã€ã³ã¿ã䜿ã£ãé åã®ã¢ã¯ã»ã¹
é åã¯ã€ã³ããã¯ã¹ã§ã¢ã¯ã»ã¹ã§ããŸããããã€ã³ã¿ã䜿ã£ãŠãåæ§ã®æäœãå¯èœã§ãã
int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d
", p[1]); // çµæ: 20
ããã§ã¯ãp[1]
ã¯*(p + 1)
ãšåãæå³ã«ãªããŸããã€ãŸãããã€ã³ã¿ã䜿ãã°æ¬¡ã®ããã«ãæžããŸãã
printf("%d
", *(arr + 2)); // çµæ: 30
ãã®ããã«ãã€ã³ããã¯ã¹è¡šèšãšãã€ã³ã¿æŒç®ã¯æ¬è³ªçã«åãããšãããŠããŸãã
ãã€ã³ã¿æŒç®ãšé åã€ã³ããã¯ã¹ã®éã
é åãšãã€ã³ã¿ã¯äŒŒãŠããŸãããå®å šã«åãã§ã¯ãªãããšã«ã泚æãå¿ èŠã§ãã
1. ãµã€ãºã®ååŸ
é
ååã䜿ããšããã®ãµã€ãºãsizeof
ã§ååŸã§ããŸããããã€ã³ã¿ã«ä»£å
¥ããæç¹ã§ãµã€ãºã¯å€±ãããŸãã
int arr[5];
int *p = arr;
printf("%zu
", sizeof(arr)); // çµæ: 20ïŒ5Ã4ãã€ãïŒ
printf("%zu
", sizeof(p)); // çµæ: 8ïŒ64bitç°å¢ã§ã¯ãã€ã³ã¿ã¯8ãã€ãïŒ
2. æžãæãã®å¯åŠ
é ååã¯å®æ°ãã€ã³ã¿ã®ãããªãã®ã§ãããä»£å ¥ã«ãã倿Žã¯ã§ããŸããã
int arr[3];
int *p = arr;
p = p + 1; // OK
arr = arr + 1; // ãšã©ãŒïŒé
ååã¯å代å
¥äžå¯ïŒ
ãã€ã³ã¿ãšé åã䜿ãããªãã¡ãªãã
- ãã€ã³ã¿ã䜿ãã°ãã¡ã¢ãªç©ºéãæè»ã«æäœã§ãã
- é ååŠçãé«éã»å¹ççã«ãªãïŒã€ã³ããã¯ã¹ããããã€ã³ã¿æŒç®ã®æ¹ããããã«éãå ŽåãïŒ
- 颿°ã«é åãæž¡ãéã宿 ã§ã¯ãªãå é ã¢ãã¬ã¹ã®ã¿æž¡ãããã®ã§ããã€ã³ã¿ãšããŠã®ç¥èã¯å¿ é
5. 颿°ãšãã€ã³ã¿
Cèšèªã§ã¯ã颿°ã«å€æ°ãæž¡ãéã倿ž¡ãïŒcall by valueïŒãåºæ¬ã§ãããã®ããã颿°å ã§åŒæ°ã倿ŽããŠããå ã®å€æ°ã«ã¯åœ±é¿ããŸããããããããã€ã³ã¿ã䜿ãããšã§é¢æ°ããå ã®å€æ°ã®å€ãçŽæ¥æäœããããšãå¯èœã«ãªããŸãã
ãã®ç« ã§ã¯ã颿°ãšãã€ã³ã¿ã®é¢ä¿ãå€ã®æžãæãæ¹æ³ã颿°ãã€ã³ã¿ã®åºæ¬ãªã©ã颿°ã«ããããã€ã³ã¿ã®äœ¿ãæ¹ã解説ããŸãã
ãã€ã³ã¿ã䜿ã£ãå€ã®æžãæã
ãŸãã颿°å ãã倿°ã®å€ã倿Žãããå Žåããã€ã³ã¿ã䜿ãå¿ èŠããããŸãã
äŸïŒãã€ã³ã¿ãªãã®å Žå
void update(int x) {
x = 100;
}
int main() {
int a = 10;
update(a);
printf("%d
", a); // çµæ: 10ïŒå€æŽãããªãïŒ
return 0;
}
ãã®å Žåã颿°ã«ã¯a
ã®ã³ããŒãæž¡ãããŠãããããa
èªäœã¯å€æŽãããŸããã
äŸïŒãã€ã³ã¿ã䜿ãå Žå
void update(int *x) {
*x = 100;
}
int main() {
int a = 10;
update(&a);
printf("%d
", a); // çµæ: 100ïŒå€æŽãããïŒ
return 0;
}
ãã®ããã«ã倿°ã®ã¢ãã¬ã¹ã颿°ã«æž¡ãããšã§ãå ã®å€ã倿Žããããšãã§ããŸããããã¯ãåç §æž¡ãïŒcall by referenceïŒãã®ãã¯ããã¯ãšããŠåºã䜿ãããŠããŸãã
é åãšé¢æ°ã®é¢ä¿
Cèšèªã§ã¯ãé åã颿°ã«æž¡ããšèªåçã«ãã€ã³ã¿ãšããŠæ±ãããŸããã€ãŸããé åã®å é èŠçŽ ã®ã¢ãã¬ã¹ã颿°ã«æž¡ãããããã颿°å ã§å 容ã®å€æŽãå¯èœã§ãã
void setValues(int *arr, int size) {
for (int i = 0; i < size; i++) {
arr[i] = i * 10;
}
}
int main() {
int nums[3];
setValues(nums, 3);
printf("%d
", nums[1]); // çµæ: 10
return 0;
}
ãã®äŸã®ããã«ãé ååããã®ãŸãŸæž¡ãã ãã§é¢æ°å ããå 容ã倿Žã§ããŸãã
颿°ãã€ã³ã¿ã®åºæ¬
Cèšèªã§ã¯ã颿°ã®ã¢ãã¬ã¹ã倿°ã«æ ŒçŽããŠåŒã³åºãããšãã§ããŸããããã颿°ãã€ã³ã¿ã§ãã
宣èšãšäœ¿çšäŸïŒ
int add(int a, int b) {
return a + b;
}
int main() {
int (*funcPtr)(int, int); // intåãè¿ããintåã2ã€åŒæ°ã«åã颿°ãã€ã³ã¿
funcPtr = add;
int result = funcPtr(3, 4);
printf("%d
", result); // çµæ: 7
return 0;
}
颿°ãã€ã³ã¿ã¯ãåçã«é¢æ°ãéžãã§å®è¡ããããšãããã³ãŒã«ããã¯é¢æ°ã®å®è£ ãªã©ã«äœ¿ãããŸãã颿°åã ãã§ã颿°ã®ã¢ãã¬ã¹ãååŸã§ãããããæè»ãªããã°ã©ãã³ã°ãå¯èœã§ãã
å®è·µçãªäœ¿çšå Žé¢
- é åã®äžŠã¹æ¿ãïŒãœãŒãïŒã«ãããŠãæ¯èŒé¢æ°ããã€ã³ã¿ã§æž¡ã
- ã¡ãã¥ãŒéžæåããã°ã©ã ã§ãéžæè¢ããšã«å®è¡ãã颿°ã颿°ãã€ã³ã¿ã§ç®¡ç
- ã€ãã³ãé§åååŠçãã³ãŒã«ããã¯é¢æ°ã®å®è£ ïŒGUIãçµã¿èŸŒã¿ãã²ãŒã éçºãªã©ïŒ
6. ãã€ã³ã¿ã®å¿çšäŸ
ãã€ã³ã¿ã®åºæ¬çãªäœ¿ãæ¹ãçè§£ããããæ¬¡ã¯å¿çšçãªæŽ»çšæ¹æ³ãåŠãã§ãããŸããããCèšèªã®ãã€ã³ã¿ã¯ãåçãªã¡ã¢ãªæäœãé«åºŠãªããŒã¿æ§é ã®å®è£ ã«äžå¯æ¬ ã§ãããã®ç« ã§ã¯ãå®åã§ãé »ç¹ã«äœ¿ãããå¿çšçãªãã¯ããã¯ã3ã€ç޹ä»ããŸãã
åçã¡ã¢ãªç¢ºä¿ïŒmalloc
ãšfree
ïŒ
Cèšèªã§ã¯ãå®è¡æã«å¿
èŠãªã¡ã¢ãªãåçã«ç¢ºä¿ããããšãã§ããŸãããããå¯èœã«ããã®ããæšæºã©ã€ãã©ãªã®malloc
颿°ã§ãã確ä¿ãããã¡ã¢ãªã¯ãã€ã³ã¿ã§åç
§ããã䜿ãçµãã£ããfree
ã§è§£æŸããå¿
èŠããããŸãã
äŸïŒæŽæ°ãåçã«ç¢ºä¿ãã
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *)malloc(sizeof(int)); // intå1ã€åã®ã¡ã¢ãªã確ä¿
if (p == NULL) {
printf("ã¡ã¢ãªç¢ºä¿ã«å€±æããŸãã
");
return 1;
}
*p = 123;
printf("%d
", *p); // çµæ: 123
free(p); // ã¡ã¢ãªãè§£æŸ
return 0;
}
泚æç¹ïŒ
malloc
ã¯ç¢ºä¿ãããã¡ã¢ãªã®å é ã¢ãã¬ã¹ãè¿ã- æ»ãå€ã¯å¿ ãNULLãã§ãã¯
- ã¡ã¢ãªã¯äœ¿ãçµãã£ãã
free
ã§å¿ ãè§£æŸ
ãã®ããã«ãå¿ èŠãªã¿ã€ãã³ã°ã§å¿ èŠãªã ãã¡ã¢ãªã確ä¿ã§ããã®ãããã€ã³ã¿ã䜿ã£ãåçã¡ã¢ãªç®¡çã®é åã§ãã
ãã€ã³ã¿ã®ãã€ã³ã¿ïŒäºéãã€ã³ã¿ïŒ
ãã€ã³ã¿ã®ã¢ãã¬ã¹ãä¿æãããã€ã³ã¿ãã€ãŸãããã€ã³ã¿ã®ãã€ã³ã¿ããCèšèªã§ã¯ãã䜿ãããŸããç¹ã«ã颿°å ã§ãã€ã³ã¿ã倿Žãããå Žåãã2次å é åã®æäœãªã©ã§æŽ»èºããŸãã
äŸïŒé¢æ°å ã§ãã€ã³ã¿ãåæåãã
void allocate(int **pp) {
*pp = (int *)malloc(sizeof(int));
if (*pp != NULL) {
**pp = 42;
}
}
int main() {
int *p = NULL;
allocate(&p);
printf("%d
", *p); // çµæ: 42
free(p);
return 0;
}
ãã䜿ãããå Žé¢ïŒ
- é åã®é åïŒ2次å é åïŒ
- æ§é äœã®äžã§å¯å€æ°ã®é åãæã€ãšã
- è€æ°ã®æååãæ±ãïŒchar *argv ãªã©ïŒ
颿°ãã€ã³ã¿ãšé åã®çµã¿åãã
颿°ãã€ã³ã¿ãé åãšããŠä¿æããç¶æ³ã«å¿ããŠåçã«é¢æ°ãåãæ¿ããŠåŒã³åºããšãã£ãé«åºŠãªãã¯ããã¯ããCèšèªã§ã¯äžè¬çã§ãã
äŸïŒç°¡åãªã¡ãã¥ãŒéžæ
#include <stdio.h>
void hello() { printf("Hello
"); }
void bye() { printf("Goodbye
"); }
int main() {
void (*funcs[2])() = {hello, bye};
int choice = 0;
printf("0: hello, 1: bye > ");
scanf("%d", &choice);
if (choice >= 0 && choice < 2) {
funcs[choice](); // 颿°åŒã³åºã
}
return 0;
}
ãã®ãããªèšèšã¯ãç¶æ 管çãã€ãã³ãé§ååããã°ã©ã ã§ã圹ç«ã¡ãŸãã
ãã€ã³ã¿ã䜿ã£ãå¿çšçãªãã¯ããã¯ã¯ãåãªãèšè¿°å以äžã«ãã¡ã¢ãªãå®è¡å¶åŸ¡ãæèããèšèšåãæ±ããããŸãããããã䜿ãããªããããã«ãªãã°ãCèšèªã®åãæå€§éã«åŒãåºãããšãã§ããããã«ãªããŸãã
7. ãããããšã©ãŒãšãã®å¯ŸåŠæ³
ãã€ã³ã¿ã¯éåžžã«åŒ·åãªæ©èœã§ãããæ±ããééãããšãã°ãã»ãã¥ãªãã£ããŒã«ã®åå ã«ããªããŸãããã®ç« ã§ã¯ãCèšèªã«ããããã€ã³ã¿ã®äœ¿çšæã«ããçºçãããšã©ãŒãšããããé²ãããã®å¯Ÿçã«ã€ããŠè§£èª¬ããŸãã
æªåæåãã€ã³ã¿ã®äœ¿çš
æãåºæ¬çã§ãããªããå±éºãªã®ããæªåæåã®ãã€ã³ã¿ã䜿çšããã±ãŒã¹ã§ãããã€ã³ã¿ã¯å®£èšããã ãã§ã¯æå¹ãªã¢ãã¬ã¹ãæããŠããŸããã
æªãäŸïŒ
int *p;
*p = 10; // æªå®çŸ©åäœïŒpã¯ã©ããæããŠããªã
察çïŒ
- ãã€ã³ã¿ã¯å¿ ãåæåããŠãã䜿ã
- 䜿çšåã«
NULL
ãã§ãã¯ãè¡ã
int *p = NULL;
// 䜿çšåã«ã¡ã¢ãªç¢ºä¿ãŸãã¯æå¹ãªã¢ãã¬ã¹ã代å
¥
NULLãã€ã³ã¿ã®éåç §
ãã€ã³ã¿ãNULL
ãæããŠããç¶æ
ã§*p
ãè¡ããšãããã°ã©ã ã¯ã¯ã©ãã·ã¥ããŸããããã¯éåžžã«äžè¬çãªãã°ã§ãã
äŸïŒ
int *p = NULL;
printf("%d
", *p); // å®è¡æãšã©ãŒïŒã»ã°ã¡ã³ããŒã·ã§ã³ãã©ãŒã«ããªã©ïŒ
察çïŒ
- ãã€ã³ã¿ã
NULL
ã§ãªãã確èªããŠãã䜿çš
if (p != NULL) {
printf("%d
", *p);
}
ã¡ã¢ãªãªãŒã¯
åçã«ç¢ºä¿ããã¡ã¢ãªãfree
ãå¿ãããšãã¡ã¢ãªãè§£æŸãããã«èç©ããããã¡ã¢ãªãªãŒã¯ããçºçããŸããé·æéåäœããããã°ã©ã ãåã蟌ã¿ç³»ã§ã¯èŽåœçã§ãã
äŸïŒ
int *p = (int *)malloc(sizeof(int));
// åŠçãçµããŠãfreeããªã â ã¡ã¢ãªãªãŒã¯
察çïŒ
- 䜿çšãçµãã£ããå¿
ã
free
ãã malloc
ãšfree
ã®å¯Ÿå¿ãæèãã- éçºäžã¯ã¡ã¢ãªãªãŒã¯æ€åºããŒã«ïŒäŸïŒValgrindïŒã掻çš
ãã³ã°ãªã³ã°ãã€ã³ã¿
free
ããåŸã®ã¡ã¢ãªãæããŠãããã€ã³ã¿ã¯âãã³ã°ãªã³ã°ãã€ã³ã¿âãšåŒã°ããåå©çšãããšæªå®çŸ©åäœãåŒãèµ·ãããŸãã
äŸïŒ
int *p = (int *)malloc(sizeof(int));
free(p);
*p = 123; // ãšã©ãŒïŒãã§ã«è§£æŸãããã¡ã¢ãªã«ã¢ã¯ã»ã¹
察çïŒ
free
ã®åŸã¯å¿ ãNULLãä»£å ¥ããŠç¡å¹åãã
free(p);
p = NULL;
é åå€ã¢ã¯ã»ã¹
ãã€ã³ã¿ã䜿ã£ãã€ã³ããã¯ã¹æŒç®ã§ãæå³ããé åã®å¢çãè¶ ããŠããŸãããšããããŸãããããéåžžã«å±éºã§ããã°ãè匱æ§ã®åå ãšãªããŸãã
äŸïŒ
int arr[3] = {1, 2, 3};
printf("%d
", *(arr + 3)); // æªå®çŸ©åäœïŒarr[3]ã¯ååšããªãïŒ
察çïŒ
- åžžã«æå¹ãªç¯å²å ã§ã¢ã¯ã»ã¹ããŠãããã確èª
- ã«ãŒãåŠçã§ã¯ãå¢çãã§ãã¯ãã培åºãã
åããã€ã³ã¿ãäºéã«è§£æŸãã
åãã¡ã¢ãªã¢ãã¬ã¹ãfree
ããæäœã2åè¡ããšãããã°ã©ã ãã¯ã©ãã·ã¥ããå±éºããããŸãã
察çïŒ
free
åŸã®ãã€ã³ã¿ãNULLã«ããããšã§ãäºéè§£æŸã鲿¢
free(p);
p = NULL;
ãããã®ãšã©ãŒã¯ãåºæ¬ãå®ã£ãŠäžå¯§ã«ã³ãŒãã£ã³ã°ããããšã§é²æ¢å¯èœã§ããç¹ã«åå¿è ã®ãã¡ã¯ããåæåããNULLãã§ãã¯ããfreeã®åŸ¹åºããã«ãŒã«ãšããŠå®ãããšãããã°ã®ãªãã³ãŒãã«ã€ãªãããŸãã