포인터: 주소값
-포인터 변수: 주소를 담는 변수
-포인터 상수: 주소를 담는 상수(배열)
& : 주소 연산자(번지 연산자)
자료형* : 포인터 연산자
*주소값 : 참조 연산자
#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
사용자로부터 얼마를 입력 받을지 모르기 때문에
입력 받은 값에 따라 얼만큼 만들어 질 지 정해진다
'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 |
댓글