SW/C

9-1 포인터

seungH 2025. 3. 30. 21:17
#include <stdio.h>
int main(){
    int a;
    int *pa;

    pa = &a;
    *pa = 10;

    printf("포인터로 a값 출력 : %d\\n", *pa);
    printf("변수명으로 a값 출력 : %d\\n",a);

    return 0;
}

printf는 변수의 주소가 아니라 변수의 값을 필요로 하므로 이런식으로 접근한다.

반면 scanf는 변수의 값이 아니라 변수의 주소를 필요로 하므로 이런식으로 한다.

scanf("%d",&a);
scanf("%d",pa);

const를 사용한 포인터

const를 사용하면 포인터가 가르키는 변수의 값을 바꿀 수 없다는 것이다.

#include <stdio.h>
int main(){
    int a=10, b=20;
    const int *pa = &a;

    printf("변수 a 값 : %d\\n",*pa);
    pa=&b;
    printf("변수 b 값 : %d\\n",*pa);
    pa=&a;
    a=20;
    printf("변수 a 값 : %d\\n",*pa);
    
    return 0;
}

일반 변수에서 const는 상수를 만드는 것으로 한번 저장된 값을 바꿀수 없는것이다.

포인터에서 const는 가르키는 주소를 바꿀수 없는 것이 아니다!!

포인터에서 const는 간접참조해서 변수의 값을 바꾸지 못하고 읽기전용으로만 만드는것이다.

가능
a = 20;
불가능
*pa = 20;

이걸 왜사용할까?

문자열 상수를 인수로 받는 함수에서 주로 사용함. 문자열 상수는 값이 바뀌면 안되므로 매개변수로 선언된 포인터에 const를 사용함.

#include <stdio.h>

void printString(const char *str) { //받을때 const형 포인터로 받아서 인수로 받은 배열을 변경 못하게함.
    // str[0] = 'H'; // ❌ 오류! (가리키는 값 변경 불가)
    printf("%s\\n", str);
}

int main() {
    char msg[] = "hello";
    printString(msg); // 정상 동작

    printString("world"); // 문자열 상수 전달 (안전)

    return 0;
}

const와 자료형 3가지 경우

1 const char* p; p가 가리키는 데이터 변경 불가

2 char *const p; p가 가리키는 데이터 변경 불가
3 const char *const p; p가 가르키는 데이터, 주소값 둘다 변경 불가

'SW > C' 카테고리의 다른 글

11-2 버퍼를 사용하는 입력함수  (0) 2025.03.30
10-1 배열과 포인터  (0) 2025.03.30
9-2 포인터 완전정복  (0) 2025.03.30
8-2 문자 저장하기  (0) 2025.03.30
8-1 배열  (0) 2025.03.30