언어는 과-학인가요?/c언어

(c언어) 포인터(pointer)뜻

이원자 탄소 2020. 9. 12. 12:00
728x90

L value (Left value) - 이름이 있고 지속되는 값

R value (Right value) - 해당 줄에서만 존재하는 임시값

 

초기화(initialize)와 대입(assignment)

 

int a =100; (왼쪽이니까 L value)

int b = a + 200; (오른쪽 R value)

b=100;

 

포인터 pointer 

메모리의 주소값을 저장하기 위한 목적으로 선언되는 변수

 

char ch1 = 'F', ch2 = 'K';

int num = 20;

 

주소값 대신에 이름을 넣어주는것

 & : 주소연산자 //변수의 위치 알려줌

#include <stdio.h>

int main() {
	char ch1 = 'F', ch2 = 'G';
	int num = 20;

	printf("%d %c\n", ch1, ch1);
	printf("%d %c\n", ch2, ch2);
	printf("%d\n", num);
	printf("----------------------\n");

	printf("ch1 변수가 저장되어 있는 주소: [%d], [%x], [%p], [Ox%x]\n", &ch1, &ch1, &ch1, &ch1);
	printf("ch2 변수가 저장되어 있는 주소: [%d], [%x], [%p], [Ox%x]\n", &ch2, &ch2, &ch2, &ch2);
	printf("num 변수가 저장되어 있는 주소: [%d], [%x], [%p], [Ox%x]\n", &num, &num, &num, &num);



}

10진수 형태의 메모리 주소 : %d

16진수 형태의 메모리 주소 : %x

16진수 형태의 메모리 주소 (앞쪽에 0x 붙여서 표시 : 0x%d

포인터 주소 형태의 메모리 주소 (16진수 형태) : %p

 

 

* : *연산자 //포인터가 가르키는 메모리 공간에 접근할 때 사용하는 연산자

 

#include <stdio.h>

int main() {
	
	//기본자료형의 변수 선언과 초기화
	int num = 20;

	//포인터 변수 선언
	int* pnum;

	//포인터 변수에 주소값 대입시키기
	pnum = &num;

	printf("num 변수에 저장되어 있는 값 = [%d]\n", num);
	printf("num 변수의 주소값 = [%x]\n", &num);
	printf("pnum 변수에 저장되어 있는 값 = [%x]\n", pnum);
	printf("pnum 변수에 저장되어 있는 주소에 담겨있는 값 = [%d]\n", *pnum);
	printf("pnum 포인터 변수의 주소 = [%x]\n", &pnum);




}

보이다시피 pnum변수에 num변수의 주소값이 들어간 것을 볼 수 있다. 

그리고 *pnum을 사용하여 그 주소값에 어떤 값(num값) 이 저장되어 있는지 찾아가서 불러올수 있다

포인트 변수의 주소는 불러온 주소값과 다르다는걸 보여준다.

 

#include <stdio.h>

int main() {
	
	int num = 20;
	int* pnum;
	pnum = &num;
	*pnum = 30;

	printf("num 변수에 저장되어 있는 값 = [%d]\n", num);
	printf("pnum 변수에 저장되어 있는 값 = [%d]\n", *pnum);

	printf("num 변수에 저장되어 있는 주소값 = [%p]\n", &num);
	printf("pnum 포인터 변수에 저장되어 있는 주소값 = [%p]\n", pnum);

}

 다음은 num 이 포인트 변수 주소에 접근해 값으로 바꾸고 둘을 비교하는 코드이다

 

num에 저장되어있던 값 20이 30으로 바뀐 것을 볼 수 있다.

pnum의 주소값이 num의 주소값과 같아졌다는걸 볼 수 있다.

728x90