티스토리 뷰
안녕하세요 쫑쫑 블로그 입니다.
오늘은 포인터에 대한 예제를 풀어보도록 하겠습니다.
중요한 개념이라 예시까지 꼭꼭 해보시기 바랍니다!
문제 1: 사용자로 부터 배열 3개를 입력받은 후 포인터를 이용해 입력된 정수를 출력하시오
#include
int main() {
int arr[3];
int *arr2[3];
for (int i = 0; i < 3; i++) {
scanf_s("%d", &arr[i]);
arr2[i] = &arr[i];// 포인터에 주소 값 저장
}
for (int i = 0; i < 3; i++) {
printf("%d ", *arr2[i]); //저장한 주소 값의 본 값 출력
}
}
이 방식이 쉽게 생각가능한, 배열을 포인터를 사용해 출력하는 방식입니다.
하지만 과연 굳이 배열을 사용해야 할까요?!
다음 방식을 한번 보시죠.
#include
int main() {
int sum = 0;
int arr[5] = { 100, 200, 300, 400, 500 };
int *point;
point = arr;// point 는 배열의 주소를 가져오므로 &arr[0]의 주소를 가져오는 것과 똑같습니다.
for (int i = 0; i < 5; i++) {
sum += *point++;
}
/* point의 주소값을 +하는 과정이므로 &arr[0] == point; &arr[1] == point++; ... 이므로
메모리 주소값에 저장되어 있는 본 값을 더하고 다음 메모리 주소값에 있는 본 값을 더합니다.
예를 들어 point == 100; point+1 == 104; point+2 == 108;
배열 주소 arr[0] == 200; arr[1] == 204; arr[2] == 208;
형식이 int 이므로 배열의 주소값은 4씩 증가 (int는 4바이트)
point = arr; ->이말은 point의 주소 값 100과 arr[0]의 주소 값을 일치 시킨다는 말이므로
따로 포인터를 배열로 설정할 필요가 없습니다.
*/
printf("%d", sum);
return 0;
}
이 방식은 배열을 사용하지 않고 포인터의 특징(주소 값)을 이용하여 표현한 방식입니다.
원리만 알고 계시다면 훨씬 간단하게 코딩이 가능합니다.
포인터 변수에서의 증감 연산자를 설명드리겠습니다.
*point + 1 = point 가 가지고 있는 주소 값에 1을 증가
*(point +1) = point 주소 값에 1을 증가 시킨 후 그 본 값을 구함
*point++ = point 주소 값에 저장된 본 값을 구한 다음에 1을 계속 증가
(*point)++ = point 주소 본 값을 1씩 증가
*++point = point 주소 값에 1을 증가 시킨 다음에 해당 주소에 있는 본 값을 구함
이 문장들이 이해가 간다면 포인터에 개념에 대하여 이해를 잘 하신 것입니다.
만일 이해가 잘 가시지 않는다면 전 편인 포인터의 개념 부분을 읽고 오셔야합니다!!
작은 과정이 아닌 중요한 과정입니다.
다음 문제입니다.
A에 대입되어 있던 수와 B에 대입되어 있던 수를 함수를 사용하여 바꾸시오.
#include
void SwapInt(int *x, int*y);
int main() {
int a, b;
scanf_s("%d%d", &a, &b);
SwapInt(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
void SwapInt(int *x, int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
return;
}
왜 함수를 사용하는데 포인터를 사용할까요?
포인터를 사용하지 않는다면 함수에서 원하는 값에 대한 정보가 저장된 주소 값을 다시 불러올 수 없기 때문에 포인터 변수를 사용하여야 합니다.
지금은 이해가 잘 되지 않더라도 예시를 천천히 따라하시되 포인터의 주소 값에 대한 개념을 천천히 생각하시면서 이해 하는 것이 목표입니다.
한 개의 양의 정수 1개를 함수 입력 값으로 받아서(양의 정수가 아닌 경우 함수가 종료됩니다), 1부터 전달받은 양수n까지의 합계를 구해 합계를 포인터를 통해 전달하는 sum() 함수를 작성 하시오.
#include "pch.h"
#include
int SumInt(int *num);
int main() {
int result;
int num1;
scanf_s("%d", &num1);
if (num1 <= 0) {
printf("잘못입력하셨습니다.\n");
return -1;
}
result = SumInt(&num1);
printf("%d", result);
return 0;
}
int SumInt(int *num) {
int sum = 0;
for (int i = 1; i <= *num; i++) {
sum += i;
}
return sum;
}
방금과 비슷한 함수를 사용하는데 함수 값을 포인터로 받는 경우 입니다.
이해가 혹시 잘 되지 않거나 궁금하신 분은 댓글로 내용을 남겨주세요.
지금까지 쫑쫑블로그였습니다.
댓글과 공감은 사랑입니다.
'C언어 공부' 카테고리의 다른 글
C언어) 포인터의 기초개념/개념 (5) | 2019.05.14 |
---|---|
C언어) 배열 2편 다차원 배열 (2) | 2019.05.10 |
C언어) 배열의 개념 및 기본 예제 (3) | 2019.05.09 |
C언어 독학(함수) 쉽게 이해하기 (1) | 2019.05.07 |
- Total
- Today
- Yesterday
- 블루문 정의
- 토스지원
- C언어
- 장학금 받는 법
- 대외장학금
- Grip 서포터즈 참가
- 무신사
- C언어 &
- 토스 현금
- 행운퀴즈
- C언어 포인터
- 언어무료강좌
- Grip 서포터즈
- 세일
- C언어 배열
- 토스 이벤트
- 포인터 무료강좌
- 블루문 의미
- 이벤트
- 토스행운퀴즈
- C언어독학
- Grip 서포터즈2기
- C언어 포인터예제
- C언어 무료강좌
- 토스
- C언어 포인터 강좌
- 토스지원금
- 스마트컨슈머
- 삼성
- 토스공짜
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |