๐Ÿคณ [C]_23.03.27

โ€์ „ํฌ์ฃผยท2023๋…„ 3์›” 27์ผ
0

๋‹ค์šฐ_C ์ž…๋ฌธ ๊ฐ•์˜

๋ชฉ๋ก ๋ณด๊ธฐ
1/7

๐Ÿงก ๋ณด์ถฉ ์„ค๋ช…

์œ„ ์„ธ ๋ฌธ์žฅ์€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • *๊ณผ & ํ‘œ๊ธฐ๋ฒ•
    • ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด *๋Š” *๋‹ค์Œ์— ์˜ค๋Š” ๊ฒƒ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • char *p๋Š” ๊ทธ๋ ‡๋‹ค๋ฉด p๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ *p = &addr๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐฐ์—ด ํ‘œ๊ธฐ๋ฒ•๊ณผ ํฌ์ธํ„ฐ ํ‘œ๊ธฐ๋ฒ•์˜ ๊ด€๊ณ„

์•„๋ž˜๋Š” ๊ฐ™์€ ํ‘œํ˜„์ž„

  • data[1] = 5;

  • *(data +1) = 5;

  • *(data +0) ์€ *(data)๋กœ ์ค„์—ฌ์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

  • *p = 3;

  • p[0] = 3;

  • ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์™€์˜ ๊ด€๊ณ„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‘œํ˜„์€ ๋ชจ๋‘ ๋™์ผํ•œ ํ‘œํ˜„์ด๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด๋‘์ž!

    • count+i = ptr+i = &count[i] = &ptr[i] : ๋ฐฐ์—ด์˜ i+1 ๋ฒˆ์งธ ์œ„์น˜์˜ ์ฃผ์†Œ(๋ฐฐ์—ด์˜ ์‹œ์ž‘์€ 0)
    • *(count+i) = *(ptr+i) = count[i] = ptr[i] : ๋ฐฐ์—ด์˜ i+1๋ฒˆ์งธ ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ
  • ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์€ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ด๋Š” ํฌ์ธํ„ฐ์˜ ํ˜•๋ณ€ํ™˜์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์‹œ์ž‘์ฃผ์†Œ 1๋ฐ”์ดํŠธ์— ์ €์žฅ๋œ 0x78์„ 0x22๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์„๋•Œ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

    int arr[0] = 0x22;

  • ๋ฐฐ์—ด์€ ์„ ์–ธ๋œ ์ž๋ฃŒํ˜•ํƒœ์— ๋”ฐ๋ผ ์—ฐ์‚ฐ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์ฒซ ๋ฉ”๋ชจ๋ฆฌ ๋ญ‰ํ……์ด, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ int์— ํ•ด๋‹นํ•˜๋Š” 4๋ฐ”์ดํŠธ๋ฅผ 0x22๋กœ ๋ฐ”๊พผ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , 0x12345678์ด ์ €์žฅ๋˜์–ด์žˆ๋˜ 4๋ฐ”์ดํŠธ๋Š” 0x00000022 ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

    • ์ด ๋ฌธ์ œ๋Š” ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

*(char *)(arr) = 0x22;

  • ํฌ์ธํ„ฐ์˜ ํ˜•ํƒœ๋ฅผ 1๋ฐ”์ดํŠธ์ธ char๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  (์ด๋Š” ์ผ์‹œ์ ์ด๋‹ค.) arr[0]์„ ์ฃผ์†Œ๋กœ ์ฃผ๋ฉด arr[0]์˜ ์ฒซ 1๋ฐ”์ดํŠธ๋ฅผ 0x22๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ๋œ๋‹ค.

  • *p = (char *)&tips; : 1๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์„œ ์ฃผ์†Œ๋ฅผ ๋ถ€์—ฌ.

  • sum = *(p+0) + *(p+1) + *(p+2) + *(p+3); : ๊ฐ ๋ฐ”์ดํŠธ๊ฐ’์„ ํ•ฉ์‚ฐ(ํฌ์ธํ„ฐ ํ‘œ๊ธฐ)

  • sum = p[0] + p[1]+ p[2] + p[3]; : ๊ฐ ๋ฐ”์ดํŠธ๊ฐ’์„ ํ•ฉ์‚ฐ(๋ฐฐ์—ด ํ‘œ๊ธฐ)

char data;
char *p = &data; //data ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ p์— ์ €์žฅํ•จ
*p = 3; //p๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” data ๋ณ€์ˆ˜์— 3์„ ๋Œ€์ž…ํ•จ
p[0] = 3; //*p = 3; ๊ณผ ๊ฐ™์Œ


+)

  • while ๋ฌธ ์•ˆ์˜ ์กฐ๊ฑด์€ ๊ฐ’์ด ๋‚˜์˜ฌ ๋–„ ๊นŒ์ง€!!(์ฃผ์†Œ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋ฉด ๋ฌดํ•œ๋ฃจํ”„)

  • ์„ ์–ธ๋œ ๋ฌธ์ž ๋ฐฐ์—ด์— null์ด ์žˆ๊ณ , ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” while๋ฌธ์—์„œ while(**ptr) ์‹œ run time error ๋ฐœ์ƒ ( "" ๋กœ ๊ธฐ์žฌํ•˜๋ฉด ๊ฐ€๋Šฅ)

  • while(*ptr) =while(*ptr[0])

๐Ÿงก ์ด์ค‘ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜

ref. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sharonichoya&logNo=220496504183&view=img_2

  • int i =30;
  • int* p =&i;
  • int **q = &p;

๐Ÿ”ฝ

  • ๋”๋ธ” ํฌ์ธํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ.

  • ์ด์ค‘ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์ด์œ :

    • ํฌ์ธํ„ฐ ๋ฐฐ์—ด(char* ptr[])์„ ์‹ค์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋”๋ธ” ํฌ์ธํ„ฐ๋กœ ์„ ์–ธ ํ•„ (char** ptr)

    https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kails_&logNo=220165702409

  • main() ์—์„œ ์ „๋‹ฌํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํฌ์ธํ„ฐ๋ณ€์ˆ˜์˜€๊ณ , ๊ทธ ํฌ์ธํ„ฐ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๋„˜๊ฒจ์•ผ ํ•˜๋ฏ€๋กœ, &refer๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒŒ ๋งž์œผ๋ฉฐ, ๊ทธ์— ๋งž์ถฐ์„œ call_by_refer(int **ref) ์ฒ˜๋Ÿผ ์ด์ค‘ํฌ์ธํ„ฐ๊ฐ€ ๋˜๋Š”๊ฒŒ ๋งž๊ฒ ์ง€์š”.

  • printf("sizeof((double *)ptr): %d \n", sizeof((double *)ptr) ); => 4byte // ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ž๋ฃŒํ˜• ๋ณ€ํ™˜ , ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ–ˆ์œผ๋ฏ€๋กœ ์ž๋ฃŒํ˜• ์ƒ๊ด€์—†์ด 4byte ์ถœ๋ ฅ

  • printf("sizeof(*(double *)ptr): %d \n", sizeof(*(double *)ptr) ); => 8byte // ํ˜• ๋ณ€ํ™˜๋œ ์ž๋ฃŒํ˜• ํฌ๊ธฐ ํ™•์ธ

pointer7.c

//pointer7.c
#include <stdio.h>


// ptr์˜ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅ // ํฌ์ธํ„ฐ ๋ฐฐ์—ด์˜ `์ฃผ์†Œ๊ฐ’`์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์ค‘ ํฌ์ธํ„ฐ ์‚ฌ์šฉ 
funcA(char** ptr) //3000๋ฒˆ์ง€ // funcA(char*ptr[]) // ๋”๋ธ” ํฌ์ธํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ. 
{
	while (*ptr) //3000๋ฒˆ์ง€๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” 7000 
	{
		printf("%u, %u : %c \n", ptr, *ptr, **ptr); // 7000๋ฒˆ์ง€์— ์ž…๋ ฅ๋œ ๋‹จ์ผ ๋ฌธ์ž ์ถœ๋ ฅ 
		// printf("%u, %u : %s \n", ptr, *ptr, *ptr); // 7000๋ฒˆ์ง€์— ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด ์ถœ๋ ฅ 
		ptr++; // ๋‹ค์Œ ๋ฌธ์ž์—ด ์š”์†Œ ์ถœ๋ ฅ  // *(ptr++); // (*ptr)++  
	} 
}

int main()
{
	int num, * ip, ** mip;		// ์ด์ค‘ํฌ์ธํ„ฐ ๋ณ€์ˆ˜		
	// ํ•œ ๋ฒˆ๋งŒ ์ฐพ์•„๊ฐ€๋ฉด ๋ฐ์ดํ„ฐ -> ์‹ฑ๊ธ€ํฌ์ธํ„ฐ 
	// ํ•œ ๋ฒˆ ์ฐพ์•„๊ฐ”์„ ๋•Œ ์ฃผ์†Œ, ๋‘ ๋ฒˆ ์ฐพ์•„๊ฐ”์„ ๋•Œ ๋ฐ์ดํ„ฐ -> ์ด์ค‘ํฌ์ธํ„ฐ

	printf("%d, %d, %d \n", sizeof(num), sizeof(ip), sizeof(mip));

	ip = &num;
	mip = &ip;
	
	**mip = 350;

	printf("%d, %d, %d \n", num, *ip, **mip);

	char* ptr[8] = { "kingdom test",
					"Advance C programming",
					"C++ programming",
					"one two three",
					"multi campus",
					"seoul ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์–‘์žฌ๋™ 100๋ฒˆ์ง€",
					"busan ๋ถ€์‚ฐ์‹œ ํ•ด์šด๋Œ€๊ตฌ ํ•ด์šด๋Œ€๋™ ๋ฐ”๋‹ค 2 ๋ฒˆ์ง€",
					NULL };

	funcA(ptr);

	return 0;
}

// ์ด์ค‘ํฌ์ธํ„ฐ ์‚ฌ์šฉ ์ด์œ : 
//  ํฌ์ธํ„ฐ ๋ฐฐ์—ด(char* ptr[])์„ ์‹ค์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋”๋ธ” ํฌ์ธํ„ฐ๋กœ ์„ ์–ธ ํ•„ (char** ptr)


// main() ์—์„œ ์ „๋‹ฌํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํฌ์ธํ„ฐ๋ณ€์ˆ˜์˜€๊ณ , ๊ทธ ํฌ์ธํ„ฐ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๋„˜๊ฒจ์•ผ ํ•˜๋ฏ€๋กœ, &refer๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒŒ ๋งž์œผ๋ฉฐ, ๊ทธ์— ๋งž์ถฐ์„œ call_by_refer(int **ref) ์ฒ˜๋Ÿผ ์ด์ค‘ํฌ์ธํ„ฐ๊ฐ€ ๋˜๋Š”๊ฒŒ ๋งž๊ฒ ์ง€์š”. 

๐Ÿงก void ํ˜• ํฌ์ธํ„ฐ

void_pointer1.c

//void_pointer1.c 

#include <stdio.h>

int main()
{
	char ch = 'A'; 
	int num = 100;
	double dnum = 5.6; 

	void* ptr; //voidํ˜• ํฌ์ธํ„ฐ 

	printf("ptr sizeof : %d \n", sizeof(ptr));  

	ptr = &ch; 
	printf("%c \n", *(char*)ptr); // 'A' // voidํ˜• ํฌ์ธํ„ฐ๋Š” ๋ฐ”๋กœ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ๋ถˆ๊ฐ€๋Šฅ 
	ptr = &num; 
	printf("%d \n", *(int*)ptr); // 'A' // voidํ˜• ํฌ์ธํ„ฐ๋Š” ๋ฐ”๋กœ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ๋ถˆ๊ฐ€๋Šฅ 
	ptr = &dnum;
	printf("%.3lf \n", *(double*)ptr); // 'A' // voidํ˜• ํฌ์ธํ„ฐ๋Š” ๋ฐ”๋กœ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ๋ถˆ๊ฐ€๋Šฅ 

	return 0; 

}
//void ํ˜• ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ 
//ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ›์„ ํฌ์ธํ„ฐ๋ฅผ ์„ ์–ธํ•ด์ค„ ๋•Œ

๐Ÿงก Generic ํ•จ์ˆ˜๊ตฌํ˜„ : void ํฌ์ธํ„ฐ์™€ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ํ™œ์šฉ

  • Generic Function (์ž๋ฃŒํ˜•์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ๋กœ์ง์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜)
  • https://kaspyx.tistory.com/60

dataSwap.c

// dataSwap.c

#include <stdio.h>
void swap(void* sour, void* targ, int size);

int main()
{
	short int x = 100, y = 200; 
	int n1 = 500, n2 = 900; 
	double d1 = 1.1, d2 = 5.9; 
	char names[2][20] = { "kim ??", "lee ??" }; 
	
	// swap(&x, &y);  // short int *x = &x , ์ฃผ์†Œ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์œผ๋ฉด swap ๋‚ด ๋ณ€๊ฒฝ๋œ ๊ฐ’์€ ์ „๋‹ฌ๋˜์ง€ ์•Š์Œ(์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์†Œ๋ฉธ) 
	// swap2, swap3, ,,, ํ•จ์ˆ˜ 4๋ฒˆ ํ˜ธ์ถœ ํ•„ => void๋กœ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ๋งŒ๋“ค๊ธฐ!! 
	swap(&x, &y, sizeof(x)); 
	swap(&n1, &n2, sizeof(int));
	swap(&d1, &d2, sizeof(double));
	swap(names[0], names[1], sizeof(names[0]));


	printf("x : %d, y: %d \n", x, y); 
	printf("n1 : %d, n2: %d \n", n1, n2);
	printf("d1 : %lf, d2: %lf \n", d1, d2); 
	printf("%s, %s \n", names[0], names[1]); 


	return 0; 
}


// Generic Function (์ž๋ฃŒํ˜•์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ๋กœ์ง์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜) 
void swap(void* sour, void* targ, int size) // ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์†Œ๊ฐ’์„ ์ „๋‹ฌ
{  
	char tmp, i; // charํ˜• i๋Š” ์ž‘์€ ์ •์ˆ˜๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ

	for(i=0;i<size;i++)
	{ 
		tmp = *((char*)sour+i);  // voidํ˜• ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์—์„œ ๊ฐ’์„ ์‚ฌ์šฉ์‹œ ๋ฐ˜๋“œ์‹œ ์บ์ŠคํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ํฌ์ธํ„ฐ ์ž๋ฃŒํ˜• ๋ช…์‹œ 
		*((char*)sour + i) = *((char*)targ+i);
		*((char*)targ + i) = tmp; 
	} 

} 

cf. ์ผ๋ฐ˜ํ™”ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

๐Ÿงก ํ•จ์ˆ˜ ํฌ์ธํ„ฐ

function_pointer1.c

//function_pointer1.c
#include <stdio.h>
/*
ํ•จ์ˆ˜ ํฌ์ธํ„ฐ: ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜์—ฌ,
ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•œ๋‹ค.

ํ˜•์‹: ์ž๋ฃŒํ˜•(*๋ณ€์ˆ˜๋ช…)(์ธ์ž๋ฆฌ์ŠคํŠธ);
*/


void myFunc(char* ptr); // ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์„ ์–ธ๋ฌธ ๊ธฐ์žฌ ํ•„ (์ •์˜์™€ ๋™์‹œ์— ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ) 


int main()
{

	void(*fPtr)(char* ); //ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์„ ์–ธ [  ์ž๋ฃŒํ˜•(*๋ณ€์ˆ˜๋ช…)(์ธ์ž๋ฆฌ์ŠคํŠธ);  ] 
	// cf. int(*ptr)[3]; // ๋ฐฐ์—ด ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ์„ ์–ธ => 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ 

	printf("fPtr sizeof : %d \n", sizeof(fPtr)); // ์ฃผ์†Œ๊ฐ’์„ 1๊ฐœ ๋ณด๊ด€ => ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์Œ์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ฆผ => return value ๊ฐ€ void ํƒ€์ž…,  char * ๋ฐ›์•„๋“ค์ด๋Š” ํ•จ์ˆ˜ 
	fPtr = myFunc;       // ํ•จ์ˆ˜ ์ฃผ์†Œ ํ• ๋‹น(ํ•จ์ˆ˜๋ช…์€ ํ•จ์ˆ˜์˜ ์‹œ์ž‘์ฃผ์†Œ์ด๋‹ค)  
	// myFunc("this is a test."); //๋ฌธ์ž์—ด ์ƒ์ˆ˜๋Š” ๋ฌธ์ž์—ด์˜ ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’์„ ์ง€๋‹˜  
	(*fPtr)("multi campus");  // ํ•จ์ˆ˜ ํ˜ธ์ถœ 
	fPtr("Advanced C Programming");  // ํ•จ์ˆ˜ ํ˜ธ์ถœ 
	(*fPtr)("Advanced C Programming"); // ํ•จ์ˆ˜ ํ˜ธ์ถœ  

	return 0;
}

void myFunc(char *ptr)
{
	printf("myFunc() : %p, %s \n",ptr, ptr); 
}


#include <stdio.h>

int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);

int main()
{
	int (*ptrArr[4])(int x, int y)={ add, sub, mul, div }; // ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๋ฐฐ์—ด ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” 
	//int (*ptrArr)(int , int ); // ptrArr๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ 1๊ฐœ ์ €์žฅ => 4byte ํ• ๋‹น 
	//int (*ptrArr[4])(int, int); //ptrArr๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๋ฐฐ์—ด, ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ 1๊ฐœ ์ €์žฅ => 16byte ํ• ๋‹น 

	int menu_no, num1, num2, result;
	char op[4] = { '+', '-', '*', '/' };
	char tmp[10];

//	ptrArr[0] = add;

   while(1)
	{
	    printf("\n1. add\n");
   		printf("2. subtract\n");
   		printf("3. multiply\n");
   		printf("4. divide\n");
   		printf("5. end\n");
		do {
   		      printf("\nSelect(1-5) --> ");
   	          scanf("%d%*c",&menu_no); //1, 3, abc
			      //gets(tmp); //1, abc
			     // menu_no = atoi(tmp);
        } while(menu_no<0 || menu_no >5);

		   if(menu_no==5)
				break;

   		printf("Input the two numbers --> ");
   		scanf("%d %d%*c",&num1, &num2); //100 30[enter]

		// ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๋ฐฐ์—ด๋กœ 
		result = (*ptrArr[menu_no - 1])(num1, num2); // 1=> ๋ฐฐ์—ด[1]์— ๋ง์…ˆ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ์ €์žฅ => ๋ง์…ˆ ํ•จ์ˆ˜ ๋‚ด num1, num2 ๋Œ€์ž… ์ˆ˜ํ–‰  
   		printf(" %d %c %d = %d \n", num1, op[menu_no-1], num2, result);

    }

	return 0;
}

int add(int x, int y)
{
	return x+y;
}

int sub(int x, int y)
{
	return x-y;
}

int mul(int x, int y)
{
	return x*y;
}

int div(int x, int y)
{
	if(y==0)
	{
		printf("can not divide by 0\n");
		return -1;
	}
	return x/y;
}

๐Ÿงก ๋ณ€์ˆ˜์™€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ตฌ์กฐ

https://reakwon.tistory.com/20

  • stack์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • ํž™ ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‹คํ–‰์‹œ์ (Run Time)์— ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
  • heap segment๋Š” ์žฌํ™œ์šฉ ์˜์—ญ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์“ฐ์ง€ ์•Š์„ ๊ฒฝ์šฐ์— freeํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ํ•„
  • ์Šคํƒ์˜์—ญ

    • ์šฐ๋ฆฌ๋Š” ์ด์ œ๊ป ์Šคํƒ์˜์—ญ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฒฐ์ •๋˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค.
    • ํ•จ์ˆ˜์˜ ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜๋“ฑ์ด ์ด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„๋•Œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฉ”์ธ ํ•จ์ˆ˜์•ˆ์˜ ๋ณ€์ˆ˜๋“ค์€ ๋ชจ๋‘ ์Šคํƒ์˜์—ญ์— ํ• ๋‹น์ด ๋œ๊ฑฐ์ฃ .
  • ํž™ ์˜์—ญ

    • ์ด ์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‹คํ–‰์‹œ์ (Run Time)์— ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์— ์˜ํ•ด์„œ์š”. ์ด ์˜์—ญ์„ ํž™์˜์—ญ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•œ๊ฐ€์ง€ ๋” ๋ณด์ถฉ์„ค๋ช…์„ ํ•˜์ž๋ฉด ์Šคํƒ์˜์—ญ์€ ๋†’์€ ์ฃผ์†Œ์—์„œ ๋‚ฎ์€ ์ฃผ์†Œ๋กœ ํ• ๋‹น์ด ๋˜๊ณ , ํž™์˜์—ญ์€ ๋‚ฎ์€ ์ฃผ์†Œ์—์„œ ๋†’์€ ์ฃผ์†Œ๋กœ ํ• ๋‹น์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋ฅผ ๊ณ„์†ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ํž™์˜์—ญ์„ ์นจ๋ฒ”ํ•ด ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ํž™์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงก Heap ์„ธ๊ทธ๋จผํŠธ์™€ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

  • ์‚ฌ์šฉ ๊ฒฝ์šฐ:
    โ— ์ฒ˜์Œ int๋ฐฐ์—ด 100๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ int๋ฐฐ์—ด์ด 500๊ฐœ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    โ— int๋ฐฐ์—ด 500๊ฐœ๊ฐ€ ๋ชจ์ž๋ผ ๋ฐฐ์—ด 500๊ฐœ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋” ํ• ๋‹นํ•ด์•ผ ํ•  ๊ฒฝ์šฐ

void *malloc(size_t size)

  • ์ด ํ•จ์ˆ˜๋Š” size๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํž™์˜์—ญ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ž๋ฃŒํ˜•์ผ์ง€ ๋ชจ๋ฅด๋‹ˆ ๋ฐ˜ํ™˜ํ˜• ๋ฐ์ดํ„ฐ๋Š” voidํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค.

void free(void *ptr)

  • ํ•˜์ง€๋งŒ ๊ทธ๋ƒฅ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ˆ„์ถœ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ด์ œ ์“ฐ์ง€ ์•Š์„ ๊ฒฝ์šฐ(๊ฑฐ์˜ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์ง์ „)์— freeํ•จ์ˆ˜๋ฅผ ์จ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ๐Ÿ’› ํ• ๋‹น๋œ ๊ณต๊ฐ„์˜ ์ผ๋ถ€๋งŒ์„ ํ•ด์ œํ•  ์ˆ˜ ์—†์Œ.

  • ๐Ÿ’› free ๋Š” heap segment ์—์„œ๋งŒ ํ•ด์ œ ๊ถŒํ•œ์„ ๊ฐ€์ง

  • ๐Ÿ’› ์ฆ‰, free()ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋Š” malloc(), calloc(), realloc() ํ˜ธ์ถœ์—์„œ ๋ฐ˜ํ™˜๋ฐ›์€ ๊ฐ’, ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—ฌ์•ผ ํ•จ. (๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ด์ œ ๋Œ€์ƒ์ด ์•„๋‹˜)

malloc1.c

//malloc1.c 

#include <stdio.h>

int main()
{
	char* ptr; 

	ptr = (char*)malloc(100); 
	if (ptr == NULL)
	{
		perror("Error : ");
		exit(1); 
	}
	printf("input string? ");
	gets(ptr); //campus => ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด์ด ๊ด„ํ˜ธ์•ˆ์˜ ์ฃผ์†Œ(ptr)์— ๋Œ€์ž… , heap segment ์— ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋จ 

	printf("ptr: %p, %s \n", ptr, ptr); 

	free(ptr); // ๋” ์ด์ƒ ์ ‘๊ทผ ๋ถˆ๊ฐ€ํ•œ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋ฐ”๋€œ (null pointer) 
	// free(ptr); 

	printf("ptr: %p, %s \n", ptr, ptr);

	return 0; 

}

๐Ÿ”ฝ free(ptr); ์‹คํ–‰ ์ „ ์ถœ๋ ฅ


๐Ÿ”ฝ free(ptr); ์‹คํ–‰ ํ›„ ์ถœ๋ ฅ

  • free(ptr); : ๋” ์ด์ƒ ์ ‘๊ทผ ๋ถˆ๊ฐ€ํ•œ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋ฐ”๋€œ (null pointer)

  • ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ(Memory Leak)

    • ํž™ ์˜์—ญ์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•จ์ˆ˜ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋˜์–ด๋„ ํ•ด์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋Œ€์‹  free() ๋“ฑ์„ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ด ์™„๋ฃŒ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐœ์ƒํ•œ๋‹ค.

    void *calloc(size_t n, size_t size)

    • calloc์€ malloc๊ณผ ํž™์˜์—ญ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•๊ณผ ์ดˆ๊ธฐ๊ฐ’์ด ๋‹ค๋ฅธ๋ฐ์š”.
    • calloc์€ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „๋ถ€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

    void *realloc(void *memblock, size_t size)

    • reallocํ•จ์ˆ˜๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค์‹œ ํ• ๋‹นํ• ๋•Œ ์“ฐ์ž…๋‹ˆ๋‹ค.
    • ๊ธฐ์กด์— ํ• ๋‹นํ–ˆ๋˜ ํฌ์ธํ„ฐ์™€ ๋‹ค์‹œ ํ• ๋‹นํ•  size๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ์กด์— ์žˆ๋˜ ๊ฐ’์€ ๋ณ€ํ•จ์ด ์—†์Šต๋‹ˆ๋‹ค.(๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋ณด์žฅ)
    • ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ํฌ๊ธฐ๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ด (๊ธฐ์กด์ด 100, ์„ ์–ธ์ด 500 => 400๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ด)

    ๐Ÿ”ฝ

    ptr = malloc(100); 
    ptr = calloc(20, sizeof(double)); 
    ptr = realloc(ptr, 500); 
    

๐Ÿงก ๋ณต์Šต ๋ฌธ์ œ

enum_pointerEx.c

//enum_pointerEx.c
#include <stdio.h>
#include <string.h>
typedef enum Season
{
    SPRING,
    SUMMER,
    FALL,
    WINTER,
} SEASON;

GetSeason(int season)
{
    switch (season)
    {
    case 0:
        return("SPRING");
    case 1:
        return("SUMMER");
    case 2:
        return("FALL");
    case 3:
        return("WINTER");
    default:
        break;
    }
}

int main()
{
    char* ptr;
    enum  Season season = SPRING; // 1
    ptr = GetSeason(season);
    printf("์„ ํƒํ•œ ๊ณ„์ ˆ: %s \n", ptr);
    return 0;
}
//enum_pointerEx.c
#include <stdio.h>
#include <string.h>
typedef enum Season
{
    SPRING=1,
    SUMMER,
    FALL,
    WINTER,
} SEASON;

GetSeason(int season)
{
    switch (season)
    {
    case 1:
        return("SPRING");
    case 2:
        return("SUMMER");
    case 3:
        return("FALL");
    case 4:
        return("WINTER");
    default:
        break;
    }
}

int main()
{
    char* ptr;
    enum  Season season = SPRING; // 1
    ptr = GetSeason(season);
    printf("์„ ํƒํ•œ ๊ณ„์ ˆ: %s \n", ptr);
    return 0;
}
//enum_pointerEx.c
#include <stdio.h>
#include <string.h>
typedef enum Season
{
    SPRING=1,
    SUMMER,
    FALL,
    WINTER,
} SEASON;

GetSeason(int season)
{
    switch (season)
    {
    case SPRING:
        return("SPRING");
    case SUMMER:
        return("SUMMER");
    case FALL:
        return("FALL");
    case WINTER: 
        return("WINTER");
    default:
        break;
    }
}

int main()
{
    char* ptr;
    enum  Season season = SPRING; // 1
    ptr = GetSeason(season);
    printf("์„ ํƒํ•œ ๊ณ„์ ˆ: %s \n", ptr);
    return 0;
}

double_pointerEX.c

// double_pointerEX.c 


#include <stdio.h>



void funcA(char** ptr)  // ํฌ์ธํ„ฐ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ, ์ด์ค‘ ํฌ์ธํ„ฐ ์‚ฌ์šฉ ํ•„ 
{
	int i;

	while (*ptr)
	{
		printf("%u : ", ptr);
		for (i = 0; i <= ptr[i][0]; i++) // for (i = 0; *(*ptr + i); i++)
		{
			printf("%c", ptr[i][0]);
		}
		printf(" // length : %d \n", i);
		ptr++;
	}

	// *(*ptr + i)= > * ptr: ํ–‰์˜ ์‹œ์ž‘ ์ฃผ์†Œ = > * ptr + i : ๋‹ค์Œ ํ–‰ ํ˜ธ์ถœ = > * (*ptr + i) ํ• ๋‹น๋œ ํ–‰์— ๋Œ€์ž…๋œ ๊ฐ’ ์ถœ๋ ฅ // ptr[i][0]
}

int main()
{

	char* ptr[] = { "kingdom test",
					"Advance C programming",
					"C++ programming",
					"one two three",
					"multi campus",
					"seoul ์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์–‘์žฌ๋™ 100๋ฒˆ์ง€",
					"busan ๋ถ€์‚ฐ์‹œ ํ•ด์šด๋Œ€๊ตฌ ํ•ด์šด๋Œ€๋™ ๋ฐ”๋‹ค 2 ๋ฒˆ์ง€",
					NULL };

	funcA(ptr);

	return 0;
}

profile
heejoojeon@daou.co.kr

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด