반응형

앞서 간단하게 포인터란 무엇인지, 예제를 통해 설명.

https://ansan-survivor.tistory.com/1237

 

[C언어] 포인터란? 포인터에 대해 쉽게 이해하기. (포인터 변수 사용하기, 포인터로 값 변경하기,

(알아두기) 컴퓨터는 32비트와 64비트를 많이 사용한다. 이는 1번 처리에 사용할 수 있는 메모리의 크기이다. 만약 32비트(4byte) PC라면, 8 byte를 할당해도 저장할 수 있는 공간은 4byte 뿐이다. 나머지

ansan-survivor.tistory.com

 

보통 일반적으로 많이 사용되는 것은, * 하나만을 사용하는 "싱글포인터"이다.

때로는 필요에 의해 포인터에서 또다른 포인터로 참조를 하는 더블포인터, 또 더 참조하면 트리플포인터 까지 사용된다.

위와 같은 다중포인터에 대한 예제.

 1. double* ptr = #  => ptr의 타입은 double* 으로 num의 주소값을 저장.

 2. double* *dptr = &ptr;   => dptr은 double* 타입인 ptr이 대입되므로, *을 하나 더 붙여 double** 으로 만듦

#include <stdio.h>

/*
	포인터의 포인터에 대한 이해.
	변수의 주소값을 저장하기 위해서 * 을 추가 하기만 하면 된다.
*/

int main()
{
	double num = 3.14;
	double* ptr = &num;

	// ptr의 타입이 double* 이므로 dptr을 포인터 선언하기 위해서는 *를 더 붙인다.
	double** dptr = &ptr;
	// dptr의 타입이 double** 이므로 tptr을 포인터 선언하기 위해서는* 를 더 붙인다.
	double*** tptr = &dptr;

	/*
		위에 포인터의 정의를 통해, (참조관계)
		tptr -> dptr -> ptr -> num  이런식으로 포인터가 가리키고 있다.
	*/
	printf("num값: %f\n", num);
	printf("ptr값: %f\n", *ptr);
	printf("dptr값: %f\n", **dptr);
	printf("tptr값: %f\n", ***tptr);

	return 0;
}

반응형

위와 같은 참조 관계가 구성되어있기 때문에, num의 값을 새로운 포인터변수로 바꿔주면 모두 바뀌게 된다.

새로운 ptr2를 선언해서 num의 주소값을 넣고 값을 5.2를 대입해보기

#include <stdio.h>

/*
	포인터의 포인터에 대한 이해.
	변수의 주소값을 저장하기 위해서 * 을 추가 하기만 하면 된다.
*/

int main()
{
	double num = 3.14;
	double* ptr = &num;

	// ptr의 타입이 double* 이므로 dptr을 포인터 선언하기 위해서는 *를 더 붙인다.
	double** dptr = &ptr;
	// dptr의 타입이 double** 이므로 tptr을 포인터 선언하기 위해서는* 를 더 붙인다.
	double*** tptr = &dptr;

	// 새로운 ptr2선언
	double* ptr2 = NULL;
	ptr2 = &num;
	*ptr2 = 5.2;

	/*
		위에 포인터의 정의를 통해, (참조관계)
		tptr -> dptr -> ptr -> num  이런식으로 포인터가 가리키고 있다.
	*/
	printf("num값: %f\n", num);
	printf("ptr값: %f\n", *ptr);
	printf("dptr값: %f\n", **dptr);
	printf("tptr값: %f\n", ***tptr);

	return 0;
}

모두 num을 참조하기 때문에 다 바뀌게 되었다.

가리키고 있는 대상의 주소값을 확인하기

#include <stdio.h>

/*
	포인터의 포인터에 대한 이해.
	변수의 주소값을 저장하기 위해서 * 을 추가 하기만 하면 된다.
*/

int main()
{
	double num = 3.14;
	double* ptr = &num;

	// ptr의 타입이 double* 이므로 dptr을 포인터 선언하기 위해서는 *를 더 붙인다.
	double** dptr = &ptr;
	// dptr의 타입이 double** 이므로 tptr을 포인터 선언하기 위해서는* 를 더 붙인다.
	double*** tptr = &dptr;

	// 새로운 ptr2선언
	double* ptr2 = NULL;
	ptr2 = &num;
	*ptr2 = 5.2;

	/*
		위에 포인터의 정의를 통해, (참조관계)
		tptr -> dptr -> ptr -> num  이런식으로 포인터가 가리키고 있다.
	*/
	printf("num값: %f\n", num);
	printf("ptr값: %f\n", *ptr);
	printf("dptr값: %f\n", **dptr);
	printf("tptr값: %f\n", ***tptr);


	// 모두 가리키는 대상은 num의 주소값
	printf("num주소: %9p\n", &num); // ptr은 num의 주소값을 가리킴
	printf("ptr이 가리킴: %9p\n", ptr); // ptr은 num의 주소값을 가리킴
	printf("dptr이 가리킴: %9p\n", *dptr);
	printf("tptr이 가리킴: %9p\n", **tptr);
	
    return 0;
}

모두 한곳을 가리키고 있다.

 

 

포인터 변수 연산 이해 과정.

아래와 같이 괄호를 활용해서 연산 순서를 이해해보면 더 이해를 잘할 수 있다.

 

반응형

+ Recent posts