C Programming Language/C

C์–ธ์–ด ํฌ์ธํ„ฐ์˜ ํ™œ์šฉ : const, volatile, void ํฌ์ธํ„ฐ

567Rabbit 2024. 8. 12. 18:41

2์ฐจ์› ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ

 

int m[3][3];

 

- ๋ฐฐ์—ด ์ด๋ฆ„ m์€ &m[0][0]

- m[0]๋Š” 1ํ–‰์˜ ์‹œ์ž‘ ์ฃผ์†Œ

- m[1]๋Š” 2ํ–‰์˜ ์‹œ์ž‘ ์ฃผ์†Œ

...

 

2์ฐจ์› ๋ฐฐ์—ด์—์„œ m์— 1์„ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ๋Š” ๊ฒƒ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ ์‚ฌ์ง„๊ณผ ๊ฐ™๋‹ค.

 

 

#include <stdio.h>

int main(void)
{
    int m[3][3] = { {10, 20, 30}, {40, 50, 60}, {70, 80, 90} };

    printf("m = %p\n", (void *)m);
    printf("m[0] = %p\n", (void *)m[0]);
    printf("m[1] = %p\n", (void *)m[1]);
    printf("m[2] = %p\n", (void *)m[2]);

    printf("&m[0][0] = %p\n", (void *)&m[0][0]);
    printf("&m[1][0] = %p\n", (void *)&m[1][0]);
    printf("&m[2][0] = %p\n", (void *)&m[2][0]);

    return 0;
}
//๊ฒฐ๊ณผ๊ฐ’
m = 1245020
m[0] = 1245020
m[1] = 1245032
m[2] = 1245044
&m[0][0] = 1245020
&m[1][0] = 1245032
&m[2][0] = 1245044

 

 

 

 

const ํฌ์ธํ„ฐ

 

- (constant)์˜ ์•ฝ์ž์ด๋ฏ€๋กœ, ์ƒ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ , ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

- ํฌ์ธํ„ฐ ์ž์ฒด์™€ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ

- ์„œ๋ธŒ ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋“ฑ ์ฝ”๋“œ์˜ ์•ˆ์ „์„ฑ์„ ๋†’์ด๊ณ , ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค

 

- const๋ฅผ ๋ถ™์ด๋Š” ์œ„์น˜์— ๋”ฐ๋ผ์„œ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

 

 

 

volatile ํฌ์ธํ„ฐ

 

- ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ’์„ ํ•ญ์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์œผ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ

- p(ํฌ์ธํ„ฐ)๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‚ด์šฉ์ด ์ˆ˜์‹œ๋กœ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋กœ๋“œํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

- ์ค‘๊ฐ„์˜ ์ฝ”๋“œ์—์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋‚ด์šฉ์€ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•จ

 

 

 

 

 

void ํฌ์ธํ„ฐ

 

- ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋Š”, ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜

- ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ

- ํƒ€์ž…์ด ์—†๋Š” ํฌ์ธํ„ฐ

- ์–ด๋–ค ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋“  ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†๋‹ค.

- ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ๋ฌผ์€ ์•„์ง ์ •ํ•ด์ง€์ง€ ์•Š์Œ

(์˜ˆ) void *vp;

 

 

  • void ํฌ์ธํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด, ํ•จ์ˆ˜์—์„œ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•
  • void ํฌ์ธํ„ฐ๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ง์ ‘์ ์ธ ์—ฐ์‚ฐ(์˜ˆ: ์—ญ์ฐธ์กฐ, ํฌ์ธํ„ฐ ์—ฐ์‚ฐ)์„ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์ง์ ‘์ ์ธ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, void ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•จ
  • void ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ํƒ€์ž…์— ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ๋‚ด์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ์œ ์šฉํ•˜๋‹ค

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ์€ ๋ชจ๋‘ ์˜ค๋ฅ˜์ด๋‹ค

- *vp;

- *(int *)vp;  // voidํ˜• ํฌ์ธํ„ฐ๋ฅผ intํ˜• ํฌ์ธํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

- vp++;

- vp--;

 

 

  • ์—ญ์ฐธ์กฐ: *vp์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ. void ํฌ์ธํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค.
  • ํฌ์ธํ„ฐ ์—ฐ์‚ฐ: vp++๋‚˜ vp--์™€ ๊ฐ™์€ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ. ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, void ํฌ์ธํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ
  • ํ˜• ๋ณ€ํ™˜: *(int *)vp์™€ ๊ฐ™์ด void ํฌ์ธํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ด๋ฅผ ํ†ตํ•ด ์ง์ ‘์ ์ธ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

 

void ํฌ์ธํ„ฐ๋Š” ์–ด๋””์— ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

 

 

- void ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ์–ด๋–ค ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 0์œผ๋กœ ์ฑ„์šฐ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

void memzero(void *ptr, size_t len)
{
    for (; len > 0; len--) {
    	*(char *)ptr = 0;
    }
}

 

 

 

 

 

main() ํ•จ์ˆ˜

 

main() ํ•จ์ˆ˜์˜ ์ธ์ˆ˜

 

์ง€๊ธˆ๊นŒ์ง€์˜ main()ํ•จ์ˆ˜์˜ ํ˜•ํƒœ

int main(void)
{
..
}

 

 

์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๋Š” main()ํ•จ์ˆ˜ ํ˜•ํƒœ

int main(int argc, char *argv[])
{
...
}

 

 

#include <stdio.h>

int main(int argc, char *argv[])
{
    int = i;

    for(i = 0 ; i < argc ; i++)
    	printf("๋ช…๋ น์–ด ๋ผ์ธ์—์„œ %d๋ฒˆ์งธ ๋ฌธ์ž์—ด = %s\n", i, argv[i]);

    return 0;
}

 

 

 

 

 

 

์˜ˆ์ œ

 

- mile์„ km๋กœ ๋ฐ”๊พธ๋Š” ํ”„๋กœ๊ทธ๋žจ

 

 

mile = atof(argv[1]);

- atof ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์„ ์‹ค์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

- ์ฆ‰, ๋ช…๋ นํ–‰ ์ธ์ˆ˜๋กœ ๋ฐ›์€ ๋ฌธ์ž์—ด(argv[1])์„ double ํƒ€์ž…์˜ ์‹ค์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ mile ๋ณ€์ˆ˜์— ์ €์žฅ

 

km = 1.609 * mile;

- ์ด ์ค„์€ mile ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋งˆ์ผ ๊ฐ’์„ ํ‚ฌ๋กœ๋ฏธํ„ฐ๋กœ ๋ณ€ํ™˜

- 1.609๋Š” 1๋งˆ์ผ์ด ์•ฝ 1.609ํ‚ฌ๋กœ๋ฏธํ„ฐ์— ํ•ด๋‹นํ•œ๋‹ค๋Š” ์ƒ์ˆ˜ ๊ฐ’

- ๋”ฐ๋ผ์„œ mile ๊ฐ’์„ 1.609๋กœ ๊ณฑํ•˜์—ฌ km ๋ณ€์ˆ˜์— ์ €์žฅํ•จ์œผ๋กœ์จ ํ‚ฌ๋กœ๋ฏธํ„ฐ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜๋œ ๊ฐ’์„ ์–ป๋Š”๋‹ค

 

 

 

 

 

qsort() ํ•จ์ˆ˜

- qsort()๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜

 

 

 

- base : ์ •๋ ฌ๋  ๋ฐฐ์—ด์˜ ์ฃผ์†Œ

- nitems : ์›์†Œ๋“ค์˜ ๊ฐœ์ˆ˜(๋ฐฐ์—ด์˜ ํฌ๊ธฐ)

- size : ๊ฐ ์›์†Œ๋“ค์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ ๋‹จ์œ„)

- compar : 2๊ฐœ์˜ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜

 

 

qsort()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” compar ํ•จ์ˆ˜์˜ ํ˜•์‹์„ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•˜๋ฉฐ, const void * ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.

qsort() ํ•จ์ˆ˜์—์„œ compar ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ •๋ ฌ์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ์—ญํ• ์„ ํ•จ

- ์ •๋ ฌ ๊ธฐ์ค€ ๊ฒฐ์ •: qsort()๋Š” ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ทธ ์ƒ๋Œ€์  ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•จ. ์ด ๋น„๊ต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด compar ํ•จ์ˆ˜์˜ ์ฃผ๋œ ์—ญํ• 

 

 

 

 

์˜ˆ์ œ

 

#include <stdio.h>
#include <stdlib.h>  //qsort()์™€ ๊ฐ™์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํฌํ•จ

int values[] = { 98, 23, 99, 37, 16 };  //์ •์ˆ˜ํ˜• ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”

int compare(const void *a, const void *b)
{
    return (*(int*)a - *(int*)b);
}

int main()
{
    int n;

    qsort(values, 5, sizeof(int), compare);
    
    printf("์ •๋ ฌํ•œ ํ›„ ๋ฐฐ์—ด: ");
    for (n = 0 ; n < 5 ; n++)
    	printf("%d", values[n]);
    printf("\n");

    return 0;
}

 

 

(int*)a์™€ (int*)b๋Š” ์ด ํฌ์ธํ„ฐ๋“ค์„ int* ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹ค์ œ ์ •์ˆ˜ ๊ฐ’์— ์ ‘๊ทผํ•จ

*(int*)a - *(int*)b๋Š” ๋‘ ์ •์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ทธ ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜. ์ด ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋‘ ์›์†Œ์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

values: ์ •๋ ฌํ•  ๋ฐฐ์—ด์˜ ์‹œ์ž‘ ์ฃผ์†Œ

5: ๋ฐฐ์—ด์˜ ์›์†Œ ๊ฐœ์ˆ˜

sizeof(int): ๊ฐ ๋ฐฐ์—ด ์›์†Œ์˜ ํฌ๊ธฐ(๋ฐ”์ดํŠธ ๋‹จ์œ„)

compare: ์›์†Œ๋ฅผ ๋น„๊ตํ•˜๋Š” ํ•จ์ˆ˜