Small Grey Outline Pointer 포인터의 목적/메모리의 동적 할당
본문 바로가기
Dev./C++

포인터의 목적/메모리의 동적 할당

by sso. 2022. 3. 25.



포인터: 주소값
-포인터 변수: 주소를 담는 변수
-포인터 상수: 주소를 담는 상수(배열)



& : 주소 연산자(번지 연산자)
자료형* : 포인터 연산자
*주소값 : 참조 연산자

#include <stdio.h>

void main() {

	int data = 10;
	int* pData = &data; //int*포인터연산자
	printf("%d\n", *pData); // *pData참조연산자
	*pData = 20;
	printf("%d\n",data);


}

 

 

#include <stdio.h>


//5개의 정수를 입력받고 최소값과 최대값을 구해주는 함수
//포인터를 사용하여, 리턴을 받지 않아도 값이 출력 되도록

void getMaxAndMin(int arData[], int*max, int*min) {

	*max = arData[0];
	*min = arData[0];

	for (int i = 1; i < 5; i++) {
		if (*max < arData[i]) { *max = arData[i]; }
		if (*min > arData[i]) { *min = arData[i]; }
	}
}

void main() {

	int arData[5] = { 4,7,3,9,8 };
	int max = 0;
	int min = 0;

	getMaxAndMin(arData, &max, &min);
	printf("최대값 %d\n", max);
	printf("최소값 %d\n", min);
}

최대값: 9

최소값: 3

 

저번에 했던 문제에서 포인터로 변경해서 사용

 

 

#include <stdio.h>


void function(int*);

void main() {
	int data = 10; //10이라는 값을 전달한 게 아니라, data '주소' 를 전달한 것
	function(&data);
	printf("%d", data);
}

void function(int* pData) {
	*pData = 20; 
	// data 주소에 *p 접근해서 값을 20을 변경, 따라서 functon에 리턴이 없어도 값이 변경 됨
}

 

 

 



<포인터를 사용하는 이유>


1. 다른 영역에 있는 변수의 값을 수정하기 위해서
함수는 한 개의 값만 리턴할 수 있으므로 포인터를 사용해서 값을 변경 할 수 있다


2. 동적 메모리 할당

-필요한 헤더파일: stdlib.h
-동적할당 (dynamic allocation)


동적 배열 할당
자료형* 포인터명 =(자료형*)malloc(sizeof(자료형 *길이);
 

동적 배열 초기화 (clear allocation)
자료형* 포인터명= (자료형*)calloc(길이, sizeof(자료형));


동적 배열 크기 변경 (resize allocation)
포인터명= (자료형*)realloc(포인터명, sizeof(자료형)*길이);


동적 메모리 해제
free(포인터명);

메모리를 해제하지 않으면 사라지지 않고 남아있기 때문에 
꼭 반드시 free함수로 메모리 해제를 해줘야 한다

 

 

-초기화 하지 않았을 때

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

void main() {
	int* dAr = 0;
	dAr = (int*)malloc(sizeof(int) * 5); //동적 배열 할당 malloc
	printf("%d", dAr[0]); 
	
	free(dAr); //동적 배열 해제
//결과: 초기화 되지 않은 쓰레기값이 들어옴 

}

 

 

-초기화 했을 때

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

void main() {
	int* dAr = 0;

	dAr = (int*)calloc(5, sizeof(int)); //초기화 함->바이트를 전부 0으로 초기화
	printf("%d", dAr[0]); 
	
	free(dAr); //동적 배열 해제
    //결과: 0

}

 

 

-초기화, 배열 크기 변경 

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

void main() {
	int* dAr = 0;

	dAr = (int*)calloc(5, sizeof(int));//초기화 함->바이트를 전부 0으로 초기화
	dAr = (int*)realloc(dAr, sizeof(int) * 8); //realloc->사이즈를 8로 변경

	
	for (int i = 0; i < 8; i++) {
		printf("%d\n", dAr[i]);
	}


	free(dAr); //동적 배열 해제



}

 

5개는 초기화가 되어 0으로 나오지만

배열크기를 8로 변경 후 콘솔창을 보면 5개 이후로는 초기화가 되지 않은 상태

 

 

 


1~8 출력하기

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

void main() {
	int* dAr = 0;

	dAr = (int*)calloc(5, sizeof(int));//초기화 함->바이트를 전부 0으로 초기화
	dAr = (int*)realloc(dAr, sizeof(int) * 8); //realloc->사이즈를 8로 변경

	
	for (int i = 0; i < 8; i++) {
		dAr[i] = i + 1;
		printf("%d\n", dAr[i]);
	}

	free(dAr); //동적 배열 해제

}

for문 안에 dAr[i]= i + 1 을 넣어주면 반복하면서 숫자 순서대로 출력

 

 

 


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

//함수 정의
void getMaxAndMin(int*, int, int*, int*);

void main() {
	int size = 0;
	int max = 0, min = 0;
	int* dAr = 0;

	printf("정수의 개수: ");
	scanf_s("%d", &size);

	//사용자에게 입력 받은 개수만큼 동적 배열의 칸을 할당한다
	dAr = (int*)calloc(size, sizeof(int));

	for (int i = 0; i < size; i++) {
		printf("%d 번째 정수: ", i + 1); //i=0부터 시작하므로, +1 로 1번째를 만들어준다
		scanf_s("%d", dAr + i); //dAr[0] i=0 부터, 배열의 시작은 0부터 시작
	}

	//동적 배열의 사작주소, 배열의 칸 수, 최대값을 담을 변수의 주소, 최소값을 담을 변수의 주소
	getMaxAndMin(dAr, size, &max, &min);
	
	printf("최대값:  %d\n", max);
	printf("최소값:  %d\n", min);

}

void getMaxAndMin(int* dAr,int size, int* max, int* min) {
	//외부에서 전달 받은 최대,최소값 변수의 주소를 직접 접근하여 0번째 값을 넣어준다
	*max = dAr[0];
	*min = dAr[0];

	for (int i = 0; i < size; i++) {
		if (*max < dAr[i]) { *max = dAr[i]; }
		if (*min > dAr[i]) { *min = dAr[i]; }
	}
	//함수 종료시 전달받은 max,min 주소는 이미 최대값과 최소값으로 변경되어 있다\
	//return 할 필요가 없다
}

정수의 개수: 4
1 번째 정수: 1
2 번째 정수: 2
3 번째 정수: 3
4 번째 정수: 9
최대값:  9
최소값:  1

 

 

정수의 개수: 8
1 번째 정수: 1
2 번째 정수: 2
3 번째 정수: 3
4 번째 정수: 4
5 번째 정수: 5
6 번째 정수: 6
7 번째 정수: 7
8 번째 정수: 8
최대값:  8
최소값:  1

 

사용자로부터 얼마를 입력 받을지 모르기 때문에

입력 받은 값에 따라 얼만큼 만들어 질 지 정해진다

728x90

'Dev. > C++' 카테고리의 다른 글

포인터와 함수의 관계/call by value/call by reference  (0) 2022.03.27
visual studio 디버깅 하기  (0) 2022.03.26
문자열 연습문제  (0) 2022.03.23
함수 예제  (0) 2022.03.22
함수  (0) 2022.03.22

댓글