티스토리 뷰
개발자의 C언어 독학 기초 # 포인터
모든 강의 자료 : www.codingnow.co.kr/
20년 개발 경력자의 블로그 입니다.
이번시간에는 포인터에 대해 설명한다.
대학 시절 포인터를 배우기 전에 교수님의 한마디
포인터는 어렵다
이말은 졸업할때까지 나의 머리 속에 따라 다녔다.
그러나 실제 실무속에서의 포인터는 어렵지도 복잡하지도 않았다.
반드시 필요한 프로그래밍 문법이자 반드시 내가 숙지 하고 있어야 프로그래밍의 유연성을 가져 갈 수 있다.
포인터란?
이런 저런 복잡한 말들이 많은데 단순하게 "변수의 주소를 가지고 있는 것" 정도이다.
그 이상도 그 이하도 아니다.
예를 들어 a = 1;
이라고 변수를 선언하면 a라는 변수는 RAM(메모리) 어딘가에 컴파일러가 생성을 한다.
그 주소를 알고 싶어 포인터라는 것이 생긴 것이다.
포인터 변수의 선언은 아래와 같이 한다.
char * b; //변수타입 * 변수명;
예를 들어 a라는 변수를 포인터로 접근하는 예제 소스이다.
#include <stdio.h>
#include <windows.h>
void main(void)
{
system("chcp 65001"); //gcc 한글 깨짐
system("cls"); //화면지움
char a = 3; // a 변수 선언
char *b; //a의 주소를 받을 포인터 b 변수 선언
b = &a; //b의 주소를 포인터에 기록한다.
printf("a = %d\n",a); //a 변수 값을 출력
printf("b = %d\n",*b); //포인터 b를 통해 a변수를 접근하여 a값을 출력
printf("b가 가지고 있는 a의 주소 = 0x%X\n",b);
return;
}
여기서 좀더 응용을 하게 되면 a라는 변수의 값을 포인터 변수로 수정할 수 있다.
#include <stdio.h>
#include <windows.h>
void main(void)
{
system("chcp 65001"); //gcc 한글 깨짐
system("cls"); //화면지움
char a = 3; // a 변수 선언
char *b; //a의 주소를 받을 포인터 b 변수 선언
b = &a; //b의 주소를 포인터에 기록한다.
*b = 4;//포인터 변수의 값을 수정하면 a변수의 값이 변경된다.
printf("a = %d\n",a); //a 변수 값을 출력
printf("b = %d\n",*b); //포인터 b를 통해 a변수를 접근하여 a값을 출력
printf("b가 가지고 있는 a의 주소 = 0x%X\n",b);
return;
}
*b = 4; 를 추가 했는데 a의 값이 변경 된 것을 볼 수 있다.
즉 *b = 4;와 a = 4; 는 같은 동작을 하게되는데 포인터 변수가 가지고 있는 주소를 이용해서 값을 변경한 것으로 이해하면 된다.
이번에는 배열을 접근 하는 하여 응용해 보겠다.
이전 강의인 #다중 배열의 기초의 소스코드를 변형하여 포인터를 설명한다.
즉 이전 강의의 소스 코드를 이해하고 비교 할 수 있다면 이해가 좀더 쉽다.
https://cflab2017.tistory.com/13
이전 코드에서 최소한의 변경을 하여 포인터 사용 예제를 만들어 보았다.
추가된 부분은
1. 배열의 첫번째 주소를 포인터에 담고
2. 가져올때는 포인터로 선언된 시작 주소 부터 하나씩 증가해서 값을 가져온다.
이해가 어렵다고 생각되도 걱정은 안해도된다.
단지 익숙하지 않아서 이다.
포인터는 코드의 유연성을 향상시켜 주기때문에 다양한 형태로 주소를 접근하여
읽고 쓰게 된다.
중요한것은 다양한 형태로 사용되는 포인터 소스 코드를
접하는 게 중요하다.
#include <stdio.h>
#include <time.h>
#include <windows.h>
void main(void)
{
int num1, num2, result, sum;
int score;
system("chcp 65001"); //gcc 한글 깨짐
system("cls"); //화면지움
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[10] = {10,20,30,40,50,60,70,80,90,100};
int * p1 = &arr1[0];
int * p2 = &arr2[0];
score = 0;
for(int cnt=0; cnt<10; cnt++)
{
num1 = p1[cnt];//arr1[cnt];
num2 = p2[cnt];//arr2[cnt];
sum = num1+ num2; //답을 구한다.
//문제를 출제한다.
printf("\n %02d번째 문제 %d + %d = ",(cnt+1), num1, num2);
//답을 입력받는다.
scanf("%d", &result);
//결과를 표시한다.
if(sum == result)
{
printf(" 정답입니다.\n");
score += 10;
}else{
printf(" 오답입니다. 정답은 %d 입니다.\n", sum);
}
}
printf("-------------------------------------\n");
printf(" 100점 만점에 %d입니다.\n",score);
printf("-------------------------------------\n");
system("pause");
return;
}
'C언어 강의' 카테고리의 다른 글
개발자의 C언어 독학 기초 # 구조체 (0) | 2020.04.14 |
---|---|
개발자의 C언어 독학 기초 # 함수 (0) | 2020.04.14 |
개발자의 C언어 독학 기초 # 기본 연산 (0) | 2020.04.11 |
개발자의 C언어 독학 기초 # 다중 배열의 기초 (0) | 2020.04.10 |
개발자의 C언어 독학 기초 # 배열의 기초 (0) | 2020.04.10 |