공부 중 메모/수업 예제 (KGCA)

C언어 포인터 관련 예제

라이피 (Lypi) 2018. 6. 13. 22:49
반응형

출처 : KGCA 게임 아카데미(http://www.kgcaschool.com/). 수업 예제 파일.


1)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
	{
		// 포인터 변수 할당, 기본 void*에서 int*로 형변환
		printf("\n=====================\n");

		int* pPoint = (int*)malloc(sizeof(int));
		*pPoint = 100;
		printf("%0x번지 : %d\n", pPoint + 0, *(pPoint + 0));
		free(pPoint);
	}

	{
		//포인터 변수 배열 할당
		printf("\n=====================\n");

		int* pPointArray = (int*)malloc(sizeof(int) * 10);
		for (int iCnt = 0; iCnt < 10; iCnt++) {
			pPointArray[iCnt] = iCnt * 10;
			printf("\n0x%08x번지 : %d", &pPointArray[iCnt], *(pPointArray + iCnt));
		}
		free(pPointArray);
	}
}


2)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
	{
		//문자형 포인터 변수 배열 할당
		printf("\n=====================\n");
		char* pCharPoint = NULL;
		int iCount = 0;
		pCharPoint = (char*)malloc(sizeof(char) * 100);
		//멀티바이트에서 _getche()==0라는 것은 확장키가 입력되었다는 뜻이다.
		//방향키 또는 home, end, insert 등은 0x00E0을 반환한다.

		do {
			pCharPoint[iCount++] = _getche(); // 누른 값을 포인터 배열에 저장한다.

			int iValue = 0;
			iValue = _getch();				// 두번째 누른 값을 iValue에 저장한다.

			if (iValue != 0 && iValue != 0x00E0) {	// 두번째 누른값이 확장키가 아니고 방향키등이 아니면 
				pCharPoint[iCount++] = iValue;		// 값을 포인터 배열에 저장한다.
				printf("*"); // password			// 두번째 값이 저장되면 * 출력
			}
		} while (pCharPoint[iCount - 1] != '\r'); //Enter키는 'Wr' + 'Wn'이므로 한바이트씩 입력받을 때는 '\r'으로 확인해야한다.

		//알파벳 또는 숫자키를 입력시 확장키코드(널문자 추가)로 반환하는 문제가 시스템에 따라 발생한다.
		/*do {
		pCharPoint[iCount++] = _getche();
		} while (pCharPoint[iCount - 1] != '\r');*/


		pCharPoint[iCount - 1] = 0;
		printf("\n");
		printf("0x%08x번지 : %s \n", pCharPoint, pCharPoint);
		for (int iCnt = 0; iCnt < iCount; iCnt++) {
			printf("0x%08x번지 : %c \n", pCharPoint + iCnt, *(pCharPoint + iCnt));
		}
		free(pCharPoint);
	}

	{
		//포인터 배열 변수 할당
		printf("\n=====================\n");
		int* IpPoint[10]; //포인터 배열 선언

		for (int iCnt = 0; iCnt < 10; iCnt++) {
			IpPoint[iCnt] = (int*)malloc(sizeof(int));	//각 포인터 배열에 동적할당
			*IpPoint[iCnt] = iCnt * 10;					//값 입력
			printf("0x%08x번지 : %d \n", IpPoint + iCnt, *IpPoint[iCnt]);	//주소와 값 출력
		}

		for (int iCnt = 0; iCnt < 10; iCnt++) { //포인터 배열에 각각 할당된 것은 각각 풀어줘야 한다.
			free(IpPoint[iCnt]);
		}
	}
}


3)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
	{
		printf("\n=====================\n");

		//2차원 배열 초기화 및 접근
		int iValue[3][2] = { { 10,20 },{ 30,40 },{ 50,60 } };

		for (int iCnt = 0; iCnt < 3; iCnt++) {
			printf("*(iValue + %d) : %p \t iValue[%d] : %p \n",
				iCnt, *(iValue + iCnt), iCnt, iValue[iCnt]);
		}

		printf("\n");

		for (int iCnt = 0; iCnt < 3; iCnt++) {
			for (int kCnt = 0; kCnt < 2; kCnt++) {
				printf("*(*(iValue + %d) + %d) : %d \t *(iValue[%d] +%d) : %d \n",
					iCnt, kCnt, *(*(iValue + iCnt) + kCnt),
					iCnt, kCnt, *((iValue[iCnt]) + kCnt));
			}
		}
	}


	//이중 포인터 할당
	{
		printf("\n=====================\n");
		printf("\n=====이중포인터======\n");

		int *pPtr = NULL;
		int **ppPtr = NULL;
		int num = 10;

		pPtr = &num;

		//포인터의 메모리 주소는 일반포인터에 저장할 수 없으므로 반드시 이중포인터에 저장해야 한다.
		ppPtr = &pPtr;
		printf("%d\n", **ppPtr);

		//이중포인터의 할당은 시스템 비트를 고려해야한다.
		unsigned char *arr[100];
		unsigned char size = sizeof(arr);
		//32 - bit : sizeof(arr) = 400;
		//64 - bit : sizeof(arr) = 800;

#ifdef _WIN64
		//typedef __int64          intptr_t;
		//__int64 == long long
		printf("64 - bit size = %d \n", sizeof(arr));
#elif _WIN32
		//typedef int              intptr_t;
		printf("\n32 - bit size = %d", sizeof(arr));
#endif	
		//8바이트 포인터 배열? 4바이트 포인터 배열?
		//intptr_t 사용하면 시스템 비트수에 따라 변환됨.

		int **ppPoint = NULL;
		ppPoint = (int**)malloc(sizeof(intptr_t) * 10); //이중 포인터에 포인터 주소를 저장할 수 있는 공간 할당.

		for (int iCnt = 0; iCnt < 10; iCnt++) {
			ppPoint[iCnt] = (int*)malloc(sizeof(intptr_t) * 10); // 각 공간에 인트값을 저장할 수 있는 공간 할당.
		}

		for (int iCnt = 0; iCnt < 10; iCnt++) {	//내용 초기화 (당연히 배열로 접근하는게 좋다)
			for (int kCnt = 0; kCnt < 10; kCnt++) {
				ppPoint[iCnt][kCnt] = iCnt * 10 + kCnt;
			}
		}

		for (int iCnt = 0; iCnt < 10; iCnt++) {
			printf("\n");
			for (int kCnt = 0; kCnt < 10; kCnt++) {
				printf("[%d,%d] = %d \n", iCnt, kCnt, ppPoint[iCnt][kCnt]);
				printf("[%d,%d] = %d \n", iCnt, kCnt, *(ppPoint[iCnt] + kCnt));
			}
		}

		for (int iCnt = 0; iCnt < 10; iCnt++) {
			free(ppPoint[iCnt]);
		}

		free(ppPoint);
	}
}


4)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
	printf("\n====== 포인터 배열=========\n");
	char* pArray[6];

	for (int iCnt = 0; iCnt < 6; iCnt++) {
		pArray[iCnt] = (char*)malloc(sizeof(char) * 4);
	}

	for (int iCnt = 0; iCnt < 6; iCnt++) {
		for (int jCnt = 0; jCnt < 3; jCnt++) {
			pArray[iCnt][jCnt] = 65 + (iCnt * 3) + jCnt;
		}
		pArray[iCnt][3] = 0;
	}
	//char와 int는 크기차이가 날 뿐 기본적으로 같다. 
	//int배열 끝에 널문자가 들어가면 문자열로 처리할 수 있다.
	//물론 int의 아스키코드값으로 

	for (int iCnt = 0; iCnt < 6; iCnt++) {
		printf("[%d] = %s \n", iCnt, pArray[iCnt]);
	}

	for (int iCnt = 0; iCnt < 6; iCnt++) {
		free(pArray[iCnt]);
	}
}


반응형