[c] 포인터

mj·2022년 4월 22일
0

[C] 알고리즘

목록 보기
3/20
post-thumbnail

🌀포인터

: 메모리 주소를 가리키는 것, 변수의 주소값을 저장

포인터 변수 선언

: *(참조 연산자)를 붙여서 선언

int형 변수의 주소를 담고 싶으면 int * -> 가리킬 주소가 어떤 자료형을 갖는지 알려주고 위해서

ex) int형이면 4바이트만큼 읽어들이기 위해

포인터 변수의 크기는 모두 동일, 동일한 운영체제 시스템일 경우 주소값이 동일한 크기를 갖기 때문.

포인터 변수의 초기화는 NULL로만 가능. 되도록 초기화해주는것을 권장(초기화안하면 쓰레기 값이 들어가있음)


참조 연산자 *

#include <stdio.h>
int main()
{
	int *p = NULL;
    int num = 15;
    
    p = &num;
    
    printf("포인터 p의 값 : %d \n", p); //주소값 출력됨
    printf("int 변수 num의 주소 : %d \n", &num); //주소값 출력됨
    printf("포인터 p가 가리키는 값 : %d \n", *p); //15 출력됨
    
    return 0;
}

*p : p에 들어있는 주소로 가서 그 변수의 값을 가져옴. ->15출력




포인터의 우선순위

#include <stdio.h>

int main()
{
	int *p = NULL; 
	int num = 15;

	p = &num;
	printf("포인터 p가 가리키는 값 : %d\n", *p); //15
	printf("num의 값 : %d\n\n", num); //15

	*p += 5;
	printf("포인터 p가 가리키는 값 : %d\n", *p); //20
	printf("num 값 : %d\n\n", num); //20

	(*p)++;
	printf("포인터 p가 가리키는 값 : %d\n", *p); //21
	printf("num 값 : %d\n\n", num); //21

	*p++;
	printf("포인터 p가 가리키는 값 : %d\n", *p); //쓰레기값 출력
	printf("num 값 : %d\n", num); //21

	return 0;
}

증감연산자가 참조연산자보다 우선순위가 높다. 따라서 *p++의 경우, 주소를 먼저 찾아가지 않고 주소값이 들어있는 변수 p를 먼저 증가시킴.


왜 포인터를 사용할까?

포인터는 함수를 사용할 때 진가를 발휘한다.
함수는 인자를 전달할 때 복사해서 사용하므로 원래 변수는 함수에서 수정할 수가 없다.
하지만 포인터로 메모리의 주소를 넘겨주면 함수에서도 원래 변수의 값을 바로 수정하는 것이 가능하다.

#include <stdio.h>

void pointerPlus(int *num)
{
	*num += 5;
}

void numPlus(int num)
{
	num += 5;	
}

int main()
{
	int num = 15;
	printf("num 값 : %d\n", num); //15

	numPlus(num);
	printf("numPlus 사용 후 : %d\n", num); //15

	pointerPlus(&num);
	printf("pointerPlus 사용 후 : %d\n", num); //20

	return 0;
}



참고)

profile
일단 할 수 있는걸 하자.

0개의 댓글