흥달쌤 C언어 특강 23~24강

이윤설·2024년 6월 17일

흥달쌤 C언어 특강

목록 보기
4/10

23강. 포인터

포인터 변수 선언

  • 포인터란, 메모리의 위치를 표현한 기호이다.
int *a;
*a = 10;

printf("%d", a);
printf("%d", *a);

int a: 포인터 변수를 선언하는 것이다. 다만 변수명이 a는 아니고, a다.
하지만 변수의 타입이 포인터 변수다.
*a = 10: 포인터 변수 a에 값 10을 삽입한다.

*가 들어있으면 ~의 값을 붙이면 편하다.
맨처음 선언할때만 포인터 변수라고 선언하는 것이고,
그다음에 읽을 때는 "~의 값"이라고 부르면 편하다.

  1. a라는 포인터변수는 102번지라는 포인터 주소값을 갖는다.
  2. a의 값(102번지의 값)에다가 10을 넣는다.
  3. a를 갖고 있는 값은 102다.
  4. *a가 가르키고 있는 값(102번지의 값)은 10다.

변수의 주소 찾기

int b = 10;
int *a;
a = &b;
printf("%d\n", *a);
printf("%d\n", b);

  1. b의 주소값이 102번지라고 가정하자. 그러면 102번지에 변수 b와 b의 값 10이 할당된다.
  2. a = &b: &b의 의미는 "b의 주소값"이다. 따라서 a에 102가 할당된다.
  3. 따라서 a와 b는 서로를 가르킨다.
  4. *a: a의 값이므로, a가 가르키고 있는 102번지의 값인 10이다.
  5. b: 10
  • 따라서 어떠한 변수 a가 "주소값"을 갖고 있으면, a의 값(*a)을 출력한다면 그 주소값 자체가 아닌 그 주소값이 갖고있는 값을 출력한다.

연습문제

  • 출력값을 구하라.
#include <stdio.h>
void main() {
    int A = 10, B;
    int *C = &B;
    
    B = A--;
    B += 20;
    printf("%d", *C);


1. A에는 값 10, B에는 쓰레기 값, 포인터 변수 C를 선언한다.
2. 포인터 변수C에는 B의 주소값 101이 들어간다.

3. (주의) B에다가 A에서 1을 뺀 값인 9를 넣으면 안된다. 왜냐하면 "B = A--;"는 후위연산이다. 따라서 B에다가 먼저 10을 할당한 후에 A를 1 빼야한다.


4. B+=20;: 10+20=30이 들어간다.
5. *C: C의 값을 출력하므로, 30이 출력된다.
따라서 정답 = 30

24강. scanf와 변수

  • scanf: 사용자의 키보드로 입력받을 때 사용하는 함수
scanf("%d", 변수의 주소);

이 코드는 정수 값을 입력받음을 선언하고, 이 정수값을 어떤 변수의 주소값(int z의 &z)에 저장할 것인지를 선언한다.

  • scanf 사용법
int a; 
scanf("%d", &a);
printf("%d", a);
  • 연습문제
    실행 결과를 구하라. 단, 아래의 scanf() 함수의 입력으로 90을 타이핑했다고 가정.
int main() {
	int i = 10;
    int j = 20;
    int *k = &i;
    
    scanf("%d", k);
    printf("%d", %d, %d\n", i, j, *k);
    return 0;


1. i,j에 각각 10,20을 넣는다.
2. 포인터 변수 k를 선언하고, i의 주소값 100이 들어간다.


3. 90이라는 값을 k의 값으로 입력받는다. k는 i의 주소값을 담고 있기 때문에
i는 90이라는 값이 새로 들어간다.
4. i,j의 값은 각각 90,20이다. k의 값은 100번지의 값이므로, 90이다.
따라서 3개를 출력하면 90,20,90이다.

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글