ν‹°μŠ€ν† λ¦¬ λ·°

πŸ’•ν¬μΈν„°

 

포인터 λ³€μˆ˜λž€ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œ 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ³€μˆ˜μ΄λ‹€. μ—¬κΈ°μ„œ 포인터 λ³€μˆ˜λŠ” 1) λ³€μˆ˜ ν˜•νƒœμ˜ 포인터와 2) μƒμˆ˜ ν˜•νƒœμ˜ 포인터λ₯Ό μ–΄μš°λ₯΄λŠ” ν‘œν˜„μ΄λ‹€. 

 

 

πŸ’•ν¬μΈν„° λ³€μˆ˜ μ΄ˆκΈ°ν™”

 

포인터 λ³€μˆ˜λ₯Ό μš°μ„  μ„ μ–Έλ§Œ 해놓고, 이후에 μœ νš¨ν•œ μ£Όμ†Œ 값을 μ±„μ›Œλ„£μ„ 생각이라면 '널 포인터'λ₯Ό ν™œμš©ν•˜λŠ” 것이 μ’‹λ‹€.

 

int main()
{
	int *ptr1=0;
    int *ptr2=NULL; //NULL은 사싀상 0을 의미
}

널 ν¬μΈν„°λŠ” 아무데도 가리킀지 μ•ŠμŒμ„ λœ»ν•˜κΈ° λ•Œλ¬Έμ— 데이터 리슀크 없이 값을 μ΄ˆκΈ°ν™” ν•  수 μžˆλ‹€. 

 

πŸ’•ν¬μΈν„°μ™€ λ°°μ—΄μ˜ 관계 

 

λ°°μ—΄μ˜ 이름은 λ°°μ—΄μ˜ μ‹œμž‘ μ£Όμ†Œ 값을 μ˜λ―Έν•˜λ©°, κ·Έ ν˜•νƒœλŠ” κ°’μ˜ μ €μž₯이 λΆˆκ°€λŠ₯ν•œ μƒμˆ˜μ΄λ‹€. 

λ‹€μ‹œ λ§ν•˜μžλ©΄ λ°°μ—΄μ˜ 이름은 값을 λ°”κΏ€ 수 μ—†λŠ” μƒμˆ˜ ν˜•νƒœμ˜ 포인터이닀. 

 

 

βœ” 예제

#include <stdio.h>

int main()
{
	int arr[3] = { 1,2,3 };
	printf("λ°°μ—΄μ˜ 이름: %p \n", arr);
	printf("첫 번째 μš”μ†Œ: %p \n", &arr[0]);
	printf("두 번째 μš”μ†Œ: %p \n", &arr[1]);
	printf("μ„Έ 번째 μš”μ†Œ: %p \n", &arr[2]);
	//arr=&arr[i];
	return 0;
}

μ—¬κΈ°μ„œ %pλŠ” μ£Όμ†Œ κ°’μ˜ 좜λ ₯에 μ‚¬μš©λ˜λŠ” μ„œμ‹ λ¬Έμžμ΄λ‹€. 

 

RESULT:

κ²°κ³Ό κ°’ (μš”μ†Œ κ°„μ˜ 차이가 4μ”© λ‚˜λŠ” λͺ¨μŠ΅)을 톡해 intν˜• λ°°μ—΄μš”μ†Œκ°„ μ£Όμ†Œ κ°’μ˜ μ°¨λŠ” 4byteλΌλŠ” 사싀을 μ•Œ 수 μžˆλ‹€.

λ˜ν•œ λ°°μ—΄μ˜ 첫번째 λ°”μ΄νŠΈμ˜ μ£Όμ†Œκ°’κ³Ό λ°°μ—΄μ˜ 이름을 좜λ ₯ν•œ κ²°κ³Όκ°€ κ°™λ‹€λŠ” 사싀도 확인 κ°€λŠ₯ν•˜λ‹€.

즉, μ•žμ—μ„œ μ–ΈκΈ‰ν–ˆλ“― λ°°μ—΄μ˜ 이름은 λ°°μ—΄μ˜ μ‹œμž‘ μ£Όμ†Œ 값을 μ˜λ―Έν•˜λ©° κ·Έ ν˜•νƒœμ˜ 값은 μ €μž₯이 λΆˆκ°€λŠ₯ν•œ μƒμˆ˜μ΄λ‹€. 

 

πŸ’• 포인터 μ—°μ‚°

 

intν˜• 포인터λ₯Ό λŒ€μƒμœΌλ‘œ 1을 μ¦κ°€μ‹œν‚€λ©΄ 4κ°€ μ¦κ°€ν•˜κ³  doubleν˜• 포인터λ₯Ό λŒ€μƒμœΌλ‘œ 1을 μ¦κ°€μ‹œν‚€λ©΄ 8이 μ¦κ°€ν•œλ‹€. 

즉, typeν˜• 포인터λ₯Ό λŒ€μƒμœΌλ‘œ n의 크기만큼 값을 증가 및 κ°μ†Œμ‹œ, n * sizeof(TYPE) 의 크기만큼 μ£Όμ†Œ 값이 증가 및 κ°μ†Œν•œλ‹€.

 

βœ” 예제

#include <stdio.h>

int main()
{
	int arr[3] = { 11,22,33 };
	int* ptr = arr;
	printf("%d %d %d \n", *ptr, *(ptr + 1), *(ptr + 2));
	
	printf("%d", *ptr); ptr++; //printf ν•¨μˆ˜ 호좜 ν›„, ptr++ μ§„ν–‰ 
	printf("%d", *ptr); ptr++;
	printf("%d", *ptr); ptr--; // printf ν•¨μˆ˜ 호좜 ν›„, ptr-- μ§„ν–‰
	printf("%d", *ptr); ptr--;
	printf("%d", *ptr); printf("\n");
	return 0;
}

 

RESULT:

 

포인터 λ³€μˆ˜ ptr은 intν˜• ν¬μΈν„°μ΄λ―€λ‘œ 값을 1 μ¦κ°€μ‹œν‚€λŠ” 연산을 ν•  λ•Œλ§ˆλ‹€ μ‹€μ œλ‘œλŠ” 4μ”© μ¦κ°€ν•œλ‹€. 

 

 

πŸ’• *(++ptr)κ³Ό *(ptr+1)의 차이

 

μœ„ 예제λ₯Ό λ°”νƒ•μœΌλ‘œ *(++ptr)κ³Ό *(ptr+1)의 차이λ₯Ό μ•Œ 수 μžˆλ‹€. 

*(++ptr)은 ptr에 μ €μž₯된 κ°’ 자체λ₯Ό λ³€κ²½ν•˜μ§€λ§Œ *(ptr+1)은 ptr에 μ €μž₯된 값은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

즉, μ „μžλŠ” ++ μ—°μ‚°μ˜ 결과둜 μΈν•΄μ„œ 포인터 λ³€μˆ˜ ptr에 μ €μž₯된 값이 4만큼 μ¦κ°€ν•œλ‹€. κ·ΈλŸ¬λ‚˜ ν›„μžμ˜ +μ—°μ‚°μœΌλ‘œ μΈν•΄μ„œλŠ” ptr에 μ €μž₯된 값이 μ¦κ°€ν•˜μ§€ μ•Šκ³  μ¦κ°€λœ 값을 μ—°μ‚°μ˜ 결과둜 μ–»μ–΄μ„œ *λ₯Ό μ§„ν–‰ν•˜λŠ” 것이닀. 

 

결과적으둜 arr[i]λŠ” *(arr+i)와 λ™μΌν•˜λ‹€.

 

 

πŸ’• μƒμˆ˜ ν˜•νƒœμ˜ λ¬Έμžμ—΄μ„ κ°€λ₯΄ν‚€λŠ” 포인터

 

널 λ¬Έμžκ°€ μ‚½μž…λ˜λŠ” λ¬Έμžμ—΄μ˜ μ„ μ–Έλ°©μ‹μ—λŠ” 1) 배열을 μ΄μš©ν•˜λŠ” 방식 2) charν˜• 포인터 λ³€μˆ˜λ₯Ό μ΄μš©ν•˜λŠ” 방식이 μžˆλ‹€. 

char str1[]="My String"; // λ°°μ—΄μ˜ κΈΈμ΄λŠ” μžλ™μœΌλ‘œ 계산
char *str2="Your String";

μœ„μ˜ μ½”λ“œμ˜ λ‘˜μ§Έμ€„μ²˜λŸΌ 포인터 λ³€μˆ˜λ₯Ό μ΄μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ¬Έμžμ—΄μ„ μ„ μ–Έν•˜κ²Œ 되면 λ©”λͺ¨λ¦¬ 곡간에 λ¬Έμžμ—΄ "Your String"이 μ €μž₯되고, λ¬Έμžμ—΄μ˜ 첫 번째 문자 Y의 μ£Όμ†Œκ°’μ΄ λ°˜ν™˜λœλ‹€. 그리고 κ·Έ λ°˜ν™˜ 값이 포인터 λ³€μˆ˜ str2에 μ €μžμ™Όλ‹€. κ·Έλž˜μ„œ str2λ₯Ό charν˜• ν¬μΈν„°λ‘œ μ„ μ–Έν•œ 것이닀. 

 

1) κ³Ό 2) λŠ” λͺ¨λ‘ λ¬Έμžμ—΄μ˜ μ‹œμž‘ μ£Όμ†Œ 값을 λ‹΄κ³  μžˆλ‹€λŠ” μΈ‘λ©΄μ—μ„œλŠ” λ™μΌν•˜λ‹€. κ·ΈλŸ¬λ‚˜ λ°°μ—΄ 이름인 str1은 μƒμˆ˜ν˜•νƒœμ˜ 포인터기 λ•Œλ¬Έμ— λŒ€μƒμ„ λ³€κ²½ν•  수 μ—†μ§€λ§Œ λ³€μˆ˜ ν˜•νƒœμ˜ 포인터은 str2λŠ” λŒ€μƒμ„ λ³€κ²½ν•  수 μžˆλ‹€λŠ” 차이점을 μ§€λ‹Œλ‹€. 


[포인터λ₯Ό μ΄μš©ν•œ λ°°μ—΄μ˜ μ ‘κ·Ό]

 

πŸ™Œ 예제 1)

길이가 5인 intν˜• λ°°μ—΄ arr을 μ„ μ–Έν•˜κ³  이λ₯Ό 1,2,3,4,5둜 μ΄ˆκΈ°ν™”ν•œ λ‹€μŒ, 이 λ°°μ—΄μ˜ 첫 λ²ˆμ§Έμš”μ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터 λ³€μˆ˜ ptr을 μ„ μ–Έν•œλ‹€. κ·Έ λ‹€μŒ 포인터 λ³€μˆ˜ ptr에 μ €μž₯된 값을 μ¦κ°€μ‹œν‚€λŠ” ν˜•νƒœμ˜ 연산을 기반으둜 λ°°μ—΄μš”μ†Œμ— μ ‘κ·Όν•˜λ©΄μ„œ λͺ¨λ“  λ°°μ—΄μš”μ†Œμ˜ 값을 2μ”© μ¦κ°€μ‹œν‚€κ³ , μ •μƒμ μœΌλ‘œ 증가가 μ΄λ€„μ‘ŒλŠ”μ§€ ν™•μΈν•˜λŠ” 예제λ₯Ό μž‘μ„±ν•΄λ³΄μž.  

 

🀦‍♀️ μƒκ° κ³Όμ •

1. 길이가 5인 int ν˜• λ°°μ—΄κ³Ό 포인트 λ³€μˆ˜ ptr을 μ„ μ–Έν•˜μž

2. λͺ¨λ“  ptr에 μ €μž₯된 값을 μ¦κ°€μ‹œμΌœμ•Ό ν•˜λ‹ˆ λ°˜λ³΅λ¬Έμ„ ν†΅ν•΄μ„œ arr[i] λ₯Ό μ΄μš©ν•˜μ—¬ λ°°μ—΄μ˜ λͺ¨λ‘” μˆ˜μ— 2λ₯Ό λ”ν•΄λ‚˜κ°€μž

3. μ •μƒμ μœΌλ‘œ 증가 λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ λ§ˆμ§€λ§‰μ— printf λ₯Ό 톡해 좜λ ₯ν•΄μ£Όμž

 

λ‚΄κ°€ μƒκ°ν•œ λ‹΅

#include <stdio.h>

int main()
{
	int i = 0;
	int arr[5] = { 1,2,3,4,5 };
	int* ptr = arr;
	for (i = 0; i < 5; i++)
	{
		arr[i] + 2;
	}
	printf("%d", arr[5]);
	return 0;
}

RESULT:

잘λͺ»λœ 결과값이 좜λ ₯된 λͺ¨μŠ΅

 

λ‹΅μ•ˆ:

#include <stdio.h>

int main()
{
	int arr[5] = { 1,2,3,4,5 }; // λ°°μ—΄ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”
	int* ptr = arr; // 첫번째 μš”μ†Œλ₯Ό κ°€λ₯΄ν‚€λŠ” 포인터 λ³€μˆ˜ ptr μ„ μ–Έ
	int i;
	for (i = 0; i < 5; i++) // λ°˜λ³΅λ¬Έμ„ 톡해 λ©”λͺ¨λ¦¬ 곡간 포인터에 μ ‘κ·Ό
	{
		*ptr = *ptr + 2;
		ptr++;//λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œμ— κ°€κΈ° μœ„ν•¨
	}
	for (i = 0; i < 5; i++)
		printf("%d", arr[i]);

	return 0;
}

 

RESULT:

 

 

βœ” 보좩할 λΆ€λΆ„ 

1. 포인터에 λŒ€ν•΄ μˆ™μ§€κ°€ 아직 λœλ˜μ—ˆλŠ”μ§€ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°’μ— λŒ€ν•œ λ‚΄μš©μ΄ μ•„λ‹Œ κ·Έλƒ₯ λ°°μ—΄ μžμ²΄μ— μ ‘κ·Όν•˜μ—¬ 포인터 λ³€μˆ˜λ₯Ό ν™œμš©ν•˜μ§€ μ•Šμ•˜λ‹€.

2. λͺ¨λ“  λ°°μ—΄μš”μ†Œμ˜ 값을 2μ”© μ¦κ°€μ‹œν‚€λŠ” λ°©μ•ˆμ„ *ptr을 ν™œμš©ν•˜μ—¬ κ°€λ³κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹¨ 점 

 

βœ” 문제λ₯Ό μ œλŒ€λ‘œ μˆ™μ§€ν•˜μ§€ μ•Šμ•˜λ‹€. (예제 2의 쑰건으둜 문제λ₯Ό μ ‘κ·Ό)

 


πŸ™Œ 예제 2)

문제 1μ—μ„œλŠ” 포인터 λ³€μˆ˜ ptr에 μ €μž₯된 값을 λ³€κ²½μ‹œμΌœκ°€λ©΄μ„œ λ°°μ—΄μš”μ†Œμ— μ ‘κ·Όν•˜λΌκ³  ν•˜μ˜€λ‹€. 그런데 μ΄λ²ˆμ—λŠ” 포인터 λ³€μˆ˜ ptr에 μ €μž₯된 값을 λ³€κ²½μ‹œν‚€μ§€ μ•Šκ³ , ptr λŒ€μƒμœΌλ‘œ λ§μ…ˆμ—°μ‚°μ„ ν•˜μ—¬, κ·Έ 결과둜 λ°˜ν™˜λ˜λŠ” μ£Όμ†Œ 값을 ν†΅ν•΄μ„œ λͺ¨λ“  λ°°μ—΄μš”μ†Œμ— μ ‘κ·Όν•˜μ—¬ 값을 2μ”© μ¦κ°€μ‹œν‚€λŠ” 예제λ₯Ό μž‘μ„±ν•΄λ³΄μž. 

 

🀦‍♀️ μƒκ° κ³Όμ •

예제 1κ³Ό λ™μΌν•˜κ²Œ 생각

 

λ‚΄κ°€ μƒκ°ν•œ λ‹΅

#include <stdio.h>

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* ptr = arr;
	int i;
	for (i = 0; i < 5; i++)
		arr[i] = arr[i] + 2;
	for (i = 0; i < 5; i++)
		printf("%d", arr[i]);

	return 0;
}

 

RESULT:

 

λ‹΅μ•ˆ:

#include <stdio.h>

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* ptr = arr;
	int i;
	for (i = 0; i < 5; i++)
		* (ptr + i) = *(ptr + i) + 2;
	for (i = 0; i < 5; i++)
		printf("%d", arr[i]);

	return 0;
}

 

즉, 1번과 2 번 λ¬Έμ œλŠ” arr[i] == *(arr+i) λ₯Ό λ„μΆœν•˜κΈ° μœ„ν•œ μ˜λ„ 문제


πŸ™Œ 예제 3)

길이가 6인 int λ°°μ—΄ arr을 μ„ μ–Έν•˜κ³  이λ₯Ό 1,2,3,4,5,6으둜 μ΄ˆκΈ°ν™”ν•œ λ‹€μŒ, 배열에 μ €μž₯된 κ°’μ˜ μˆœμ„œκ°€ 6,5,4,3,2,1 이 λ˜λ„λ‘ λ³€κ²½ν•˜λŠ” 예제λ₯Ό μž‘μ„±ν•΄λ³΄μž. 단, λ°°μ—΄μ˜ μ•žκ³Ό λ’€λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터 λ³€μˆ˜ 두 개λ₯Ό μ„ μ–Έν•΄μ„œ 이λ₯Ό ν™œμš©ν•˜μ—¬ μ €μž₯된 κ°’μ˜ μˆœμ„œλ₯Ό λ’€λ°”κΏ”μ•Ό ν•œλ‹€. 

 

🀦‍♀️ μƒκ° κ³Όμ •

1. λ¨Όμ € λ°°μ—΄μ˜ μ•žκ³Ό λ’€λ₯Ό κ°€λ₯΄ν‚€λŠ” 포인터 λ³€μˆ˜ λ‘κ°œλ₯Ό μ„ μ–Έν•˜μ—¬ λ’€ λ°”κΏ”μ•Όν•˜λ‹ˆ tempλΌλŠ” μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό 톡해 λ‘˜μ˜ μœ„μΉ˜λ₯Ό λ°”κΏ”μ€€λ‹€.

 

λ‹΅μ•ˆ:

#include <stdio.h>

int main()
{
	int arr[6] = { 1,2,3,4,5,6 };
	int* fptr = &arr; 
	int* bptr = &arr[5];
	int i, temp;

	for (i = 0; i < 3; i++)
	{
		temp = *fptr;
		*fptr = *bptr;
		*bptr = temp;
		fptr = fptr + 1;
		bptr = bptr - 1;
	}
	for (i = 0; i < 6; i++)
		printf("%d", arr[i]);
	return 0;
}
λŒ“κΈ€
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
TAG
more
Β«   2025/06   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
κΈ€ 보관함