정보처리기사

[정보처리기사] C언어 특강 23~28강 정리(포인터)

jaeheon0520 2024. 10. 4. 07:09

포인터

메모리의 위치를 표현한 기호

 

포인터 변수 선언

 

int *a; // 어떤 변수 a를 만들었는데 이는 포인터 변수이다, 이는 어떤 주소값을 가지고 있다
*a = 10; // (a가 가리키는 주소의 값)(*)에다가 10을 넣는다

printf("%d", a); // 102
printf("%d", *a); // 10

 

 

변수의 주소 찾기

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

 

연습문제

다음 C 프로그램의 출력 값은?

#include <stdio.h>
void main() {
    int A = 10, B;
    int *c = &B;
    
    B = A--; // 대입 먼저하고 -- 하기
    B += 20;
    printf("%d", *C); // 30
}

 

메모리 영역, 포인터 영역 구분하여 풀이하기

 

scanf

사용자의 키보드로 입력받을 떄 사용하는 함수

ex) scanf("%d", 변수의주소);

printf()는 & 사용하지 않음

 

 

#include <stdio.h>
int main() {
    int i = 10;
    int j = 20;
    int *k = &i; // k 가 가리키는 것은 i 의 주소
    
    scanf("%d", k); // 90을 타이핑 했다고 가정, k가 주소값으로 쓰였으므로 k가 가리키고 있는 i라는 공간에 90을 저장
    printf("%d, %d, %d\n", i, j, *k); // 90 20 90
    return 0;
}

 

정리: 포인터 변수는 int* a = &b 이런식으로 선언함. 포인터 변수는 b의 '주소 값'을 가지고 있고, *a 이런식으로 사용하면 b를 가리킴. *의 의미는 "변수의 값"이라고 생각하면 된다.

배열과 포인터

#include <stdio.h>
int main() {
    int i;
    int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; // a 라는 값에는 배열의 시작 주소가 들어감
    int *ptr = a + 3; // ptr 이라는 포인터 변수에는 배열의 주소(a) + 3 을 가지고 있음
    for (i = 0; i < 5; i++) {
    	printf("%d", *(ptr+i)-3); // 37 47 57 67 77
    }
}

 

#incldue <stdio.h>
int main() {
    int a[] = {1, 2, 4, 8};
    int *p = a; // 배열 a 의 시작주소
    p[1] = 3; // 1 3 4 8
    a[1] = 4; // 1 4 4 8
    p[2] = 5; // 1 4 5 8
    printf("%d %d\n", a[1] + p[1], a[2] + p[2]); // 8 10
    return 0;
}

 

#incldue <stdio.h>
int main() {
    int a[] = {1, 2, 4, 8};
    int *p = a + 1; // 배열 a 의 시작주소 + 1
    p[1] = 3; // 1 2 3 8
    a[1] = 4; // 1 4 3 8
    p[2] = 5; // 1 4 3 5
    printf("%d %d\n", a[1] + p[1], a[2] + p[2]); // 7 8
    return 0;
}

 

#include <stdio.h>
int main() {
    int a[4] = {10, 20 ,30};
    int *p = a;
    p++; // a 의 시작 주소 + 1
    *p++ = 100; // p가 가리키는 주소의 값에 100을 집어넣어라 그리고 p가 가리키는 주소 + 1을 하라, 10 100 30
    *++p = 200; // 먼저 p가 가리키는 주소 + 1을 하고 p가 가리키는 주소의 값에 200을 대입하라
    printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]); // 10 100 30 ,,, 200
}

 

 

#include <stdio.h>
int main() {
    int num[4] = {1, 2, 3, 4}; // num에는 배열의 시작 주소값이 들어있음
    int *pt = num; // pt라는 포인터 변수에는 num(배열의 주소값)이 들어있다
    pt++; // num + 1
    *pt++ = 5; // 1, 5, 3, 4 ,,, pt = num + 2
    *pt++ = 10; // 1, 5, 10, 4 ,,, pt = num + 3
    pt--; // pt = num + 2
    *pt+++= 20; // 1, 5, 30 ,4 ,,, pt = num + 3
    printf("%d %d %d %d", num[0], num[1], num[2], num[3]); // 1 5 30 4
}