C언어 - 포인터의 기본적인 사용 방법

2020. 11. 11. 12:40개인공부/C언어

 

int main() {

	int a, b;

	a = 123;

	int *a_ptr; // * : asterisk

	a_ptr = &a; // & : address-of operator

	printf("%d %d %p\n", a, *a_ptr, a_ptr);

	return 0;
}

 

출력 값:

 

123 123 0000002AE31EFB04

 

a : 123

*a_ptr : 123

a_ptr :  0000002AE31EFB04

 

주소값은 실행때마다 달라진다.

 

*a_ptr의 값이 123인 이유는 a_ptr의 주소로 가서 값을 읽어와서 이다.

 

 

 

 

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int a, b;

	a = 123;

	int *a_ptr; // * : asterisk

	a_ptr = &a; // & : address-of operator

	printf("%d %d %p\n", a, *a_ptr, a_ptr);

	//printf로 주소를 출력할때는 %p를 사용한다.

	 *a_ptr = 456; // * : re-direction or de-referencing

	printf("%d %d %p\n", a, *a_ptr, a_ptr);

	return 0;
}



*a_ptr = 456;

 

a의 주소값을 가르키고 있는 *a_ptr 에 456을 넣으니

a의 값도 456이 되었다. 같은 주소를 가지고 있기 때문이다.

 

 

 

 

여기서

b = a_ptr;

정수형 변수(int b)에 주소(a_prt)를 넣으려고 한다.

 

그럼 아래와 같이 워닝이뜬다.

warning C4047: '=': 'int' differs in levels of indirection from 'int *'

 

b =*a_ptr; 로 쓰여야 할걸 b=a_ptr;로 쓴것 아니냐고 경고를 준것이다.

 

왜냐하면 주소값은 16진수인 hex이기 때문이당 ^^~

 

 

c언어에서는 프로그래머가

b = (int)a_ptr;

위와 같이 주소값을 int로 형변환 하려는 의도가 아니었나 고려하기 때문에 에러를 준것이 아니라 워닝을준것.

 

위와 같이 그대로 빌드하면 

 

형변환된 주소는 -869271548 로 나온다.

 

 

 

 

 

 

 

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

	int a, b;
	a = 123;
	int *a_ptr; 
	a_ptr = &a; 

	printf("%d %d %p\n", a, *a_ptr, a_ptr);
	// a: 123 
	// *a_ptr : 123
	// a_ptr : 000000BC4A34F5C4

	 *a_ptr = 456; // * : re-direction or de-referencing

	printf("%d %d %p\n", a, *a_ptr, a_ptr);
	// a: 456 
	// *a_ptr : 456
	// a_ptr : 000000BC4A34F5C4

	b = *a_ptr;

	printf("%d\n", b);
	//456

	*a_ptr = 789;

	printf("%d\n", b);
	//456
	printf("%d %d %p %p\n", a, *a_ptr, a_ptr, &b);
	// a: 789
	// *a_ptr : 789
	// a_ptr : 000000BC4A34F5C4 
	// &b : 000000BC4A34F5E4

	b = 12;

	printf("%d\n", b);
	//12
	printf("%d %d %p\n", a, *a_ptr, a_ptr);
	// a: 789
	// *a_ptr : 789
	// a_ptr : 000000BC4A34F5C4 

	a = 1004;
	printf("%d %d %p %d\n", a, *a_ptr, a_ptr, b);
	// a: 1004
	// *a_ptr : 1004
	// a_ptr : 000000BC4A34F5C4 
	// b : 12

	return 0;
}



 

 

 

아직 좀 헷갈리긴 하지만 머리에 조금씩 안착이 되는 느낌이 든다.

 

더 파고들자.

 

 

출처 : 홍정모의 따라배우는 C언어