관리 메뉴

FU11M00N

C언어 포인터 기본 본문

Programming/C Language

C언어 포인터 기본

호IT 2020. 4. 10. 17:08

잠깐 전 포스팅에서 봤었던 자료형들의 크기를 다시 생각해 보고,

아래의 변수들의 크기는 얼마나 나올까요?

#include <stdio.h>

int main(){
//아래의 변수들은 몇바이트일까요?

int a;
char b; 
double c;
char d[10];
char e[10][5]; 

return 0;
}

 

 

#include <stdio.h>

int main(){

int a; // 4byte
char b; // 1byte
double c;// 8byte
char d[10]; // 10 byte
char e[10][5]; // 50byte

return 0;
}

 

int와 char double의 바이트 크기는 다들 알고 계셨겠지만,

 

배열 d와 배열 e의 크기가 헷갈리는 부분이 있습니다.

char d [10]은 char 1byte가 10개 모인 배열이고

char e [10][5]는 char 5byte짜리 배열이 10개가 모여서 50byte가 되는 거예요.

 

그럼 본격적으로 포인터에 대해 알아보겠습니다. 포인터로 뭘 할 수 있는데?라고 다들 궁금해하실 거예요. 

포인터는 메모리 주소를 저장하고, 특정 자료형으로 그 주소에 접근하기 위한 자료형입니다.
포인터 변수에는 메모리의 주소를 담을 수 있는 크기와 그 주소에 접근하기 위한 자료형이 필요합니다. 

그림으로 표현하면 아래와 같습니다

사진 1-1

변수 a에는 정수 20 이란 값이 들어가 있고 a의 주소를 500번지라고 가정해 보면,

변수 a는 주소 연산자 &를 이용하여 a의 첫 주소를 포인터 변수 p에게 줬어요.

그럼 포인터 변수 p는 주소 500번지라는 값을 가지게 되고, p는 a의 첫 주소를 가리키고 있는 모습이 돼요.

 

아까 위에서 말했듯 포인터는 메모리 주소를 저장하고,

특정 자료형으로 그 주소를 접근한다는 게 위의 그림으로 설명이 돼요.

 

그럼 포인터 변수 p의 주소는 없을까요?

p도 변수이기 때문에 &p의 값은 주소 1000번지라고 가정하고 주소 1000번지라는 값이 나오게 돼요.

 

그럼 코드로 값을 확인해 볼까요?

#include <stdio.h>

int main(){
	int a= 20;
	int* p= &a;
	
	printf(" a의 값: %d\n a의 주소:%p\n",a,&a);
	printf(" p의 값:%p\n p가 가르키고있는 값:%d\n p의주소: %p\n",p,*p,&p); 
	
	
	return 0;
}

사진1-2

a의 값은 20이고

a의 주소는 00614 FE9 C p의 값은 0061 FE9C으로 값이 같죠?

p가 가리키고 있는 값 20

p의 주소 0061 FE98 

 

다들 이해가 시나요?  그럼 int a가 메모리에서 차지하는 자료형의 크기와 int p가 메모리에서 차지하는 자료형의 크기를 확인해 볼까요?

sizeof로 크기를 확인할 수 있어요.

#include <stdio.h>

int main(){
	int a= 20;
	int* p= &a;
	
	printf(" a의 값: %d\n a의 주소:%p\n",a,&a);
	printf(" p의 값:%p\n p가 가르키고있는 값:%d\n p의주소: %p\n",p,*p,&p); 
	printf("a의 크기: %d byte\n",sizeof(a));
	printf("p의 크기: %d byte",sizeof(p));
	
	return 0;
}

사진 1-3

int a의 크기는 우리가 알듯이 4byte이고 int* p의 크기는 8byte이네요?

 

포인터 변수의 크기는 int이든 double이든 char이든 모두 4 혹은 8 byte에요.

왜 4 혹은 8바이트일까요? 이건 32bit 운영체제이냐 64비트 운영체제 일 때마다 달라져요. 

32bit  컴파일을 실행하게 되면 4byte 

64bit  컴파일을 실행하게 되면 8byte가 출력될 거예요.

 

다들 포인터의 기초적인 내용 이해하셨나요?

그럼 다음엔 배열과 연관 지어 오겠습니다!

 

Comments