산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C 언어 상수 포인터 & 상수 가리키는 포인터 완전 정복

C에서 포인터는 다른 변수의 메모리 주소를 저장하는 변수이고, const 키워드는 한 번 초기화되면 값을 변경할 수 없는 변수나 포인터를 정의하는 데 쓰입니다. 포인터와 const 키워드를 결합하면 두 가지를 제어할 수 있습니다.

이 장에서는 상수 포인터의 세 가지 주요 변형을 살펴봅니다.

상수 포인터 (Constant Pointer)

상수 포인터는 포인터 자체가 상수라는 의미입니다. 한 번 메모리 위치를 가리키도록 초기화되면 다른 위치를 가리킬 수 없지만, 그 위치에 저장된 값은 여전히 변경할 수 있습니다.

상수 포인터 문법은 다음과 같습니다.

data_type *const pointer_name = &variable;

이 문법에서 data_type은 포인터가 가리키는 데이터 타입, *const가 포인터 자체를 상수로 만듦, pointer_name은 포인터 이름, &variable이 변수 메모리 주소를 할당합니다.

상수 포인터 예제

이 예제에서 상수 포인터 ptr을 선언하고 변수 x 주소로 초기화합니다. 그런 다음 ptr로 x 값을 변경하고 출력합니다.

#include <stdio.h>
int main() {
    int x = 10;
    int y = 20;
    int *const ptr = &x; // int 타입 상수 포인터
    printf("x 값: %d\n", *ptr);
    *ptr = 15; // 주소 값 변경 가능
    printf("수정된 x 값: %d\n", *ptr);
    // ptr = &y; // 포인터 주소 변경 불가
    return 0;
}

위 프로그램 출력은 포인터가 x에 고정돼 있지만 x 값은 업데이트 가능함을 보여줍니다.

x 값: 10
수정된 x 값: 15

상수 포인터 에러 예제

여기서 상수 포인터 ptr을 선언하고 변수 x 주소로 초기화한 후, 변수 y 주소를 가리키게 하려 합니다. 이는 상수 포인터가 초기화 후 다른 메모리 위치를 가리킬 수 없으므로 에러 발생합니다.

#include <stdio.h>
int main() {
    int x = 10;
    int y = 20;
    int *const ptr = &x; // int 타입 상수 포인터
    printf("x 값: %d\n", *ptr);
    // y를 가리키려 시도
    ptr = &y; // 상수 포인터 주소 변경 불가
    return 0;
}

아래 에러를 볼 수 있습니다. 상수 포인터 주소 변경 불가.

error: assignment of read-only variable 'ptr'

상수를 가리키는 포인터 (Pointer to Constant)

상수를 가리키는 포인터는 가리키는 값을 변경할 수 없지만, 포인터 자체는 다른 메모리 주소(또는 변수)를 가리킬 수 있습니다.

상수를 가리키는 포인터 문법은 다음과 같습니다.

const data_type *pointer_name = &variable;
data_type const *pointer = &variable;

이 문법에서 const data_type 또는 data_type const는 포인터가 상수 값을 가리킴을 의미, pointer_name은 포인터 이름, &variable이 변수 주소 할당.

상수를 가리키는 포인터 예제

이 예제에서 상수 값을 가리키는 포인터 ptr을 선언하고 변수 a 주소 할당. 그런 다음 포인터를 변수 b 다른 주소로 변경하고 값 출력.

#include <stdio.h>
int main() {
    int a = 5;
    int b = 30;
    const int *ptr = &a; // 상수 int 가리키는 포인터
    printf("a 값: %d\n", *ptr);
    // *ptr = 10; // 포인터로 값 수정 불가
    ptr = &b; // 포인터 주소 변경
    printf("이제 b 가리킴: %d\n", *ptr);
    return 0;
}

위 프로그램 출력은 같은 포인터가 다른 변수들 가리킴을 보여줍니다.

a 값: 5
이제 b 가리킴: 30

상수를 가리키는 포인터 에러 예제

여기서 상수를 가리키는 포인터 ptr을 선언하고 변수 a 주소로 초기화. 그런 다음 포인터로 a 값 변경 시도. 이는 상수를 가리키는 포인터가 가리키는 값 수정을 허용하지 않으므로 에러 발생.

#include <stdio.h>
int main() {
    int a = 5;
    const int *ptr = &a; // 상수 int 가리키는 포인터
    printf("a 값: %d\n", *ptr);
    // 상수 가리키는 포인터로 값 수정 불가
    *ptr = 10;
    return 0;
}

아래 출력은 상수를 가리키는 포인터로 값 수정 불가 에러 보여줍니다.

error: assignment of read-only location '*ptr'

상수를 가리키는 상수 포인터 (Constant Pointer to Constant)

상수를 가리키는 상수 포인터는 포인터가 메모리 주소를 변경할 수 없고, 그 메모리 주소에 저장된 값도 변경할 수 없습니다. 두 동작 모두 제한되므로 값만 읽을 수 있습니다.

상수를 가리키는 상수 포인터 문법:

const data_type *const pointer_name = &variable;

이 문법에서 −

상수를 가리키는 상수 포인터 예제

이 예제에서 상수를 가리키는 상수 포인터 ptr을 선언하고 변수 a 메모리 주소 할당. 포인터로 a 값 출력.

#include <stdio.h>
int main() {
    int a = 10;
    const int *const ptr = &a; // 상수 가리키는 상수 포인터
    printf("a 값: %d\n", *ptr);
    // *ptr = 15; // 값 수정 불가
    // ptr = &b; // 포인터 위치 변경 불가
    return 0;
}

위 프로그램 출력:

a 값: 10

상수를 가리키는 상수 포인터 에러 예제

이 예제에서 상수를 가리키는 상수 포인터 ptr을 선언하고 변수 a로 초기화. 그런 다음 포인터로 값 수정 시도와 다른 변수 가리키게 시도. 두 연산 모두 허용 안 돼 컴파일 에러 발생.

#include <stdio.h>
int main() {
    int a = 10;
    int b = 20;
    const int *const ptr = &a; // 상수 가리키는 상수 포인터
    printf("a 값: %d\n", *ptr);
    // *ptr = 15; // 값 수정 불가
    // ptr = &b; // 포인터 주소 변경 불가
    return 0;
}

아래 출력에서 에러 확인:

a 값: 10

상수 포인터 유형 간 차이

다음 표는 상수 포인터, 상수 가리키는 포인터, 상수 가리키는 상수 포인터 간 차이를 보여줍니다.

변형 정의 주소 변경 가능? 값 변경 가능? 문법 예시
상수 포인터 주소 고정, 해당 주소 값 수정 가능 아니오 예 int *const p = &x;
상수 가리키는 포인터 다른 주소 가리킬 수 있으나 가리키는 값 수정 불가 예 아니오 const int *p = &x;
상수 가리키는 상수 포인터 주소 고정, 해당 주소 값 수정 불가 아니오 아니오 const int *const p = &x;

결론

이 장에서 C의 상수 포인터와 상수 가리키는 포인터를 다뤘습니다. 상수 포인터는 주소 고정하지만 값 변경 허용, 상수 가리키는 포인터는 주소 변경 허용하지만 값 변경 불가, 상수 가리키는 상수 포인터는 둘 다 제한.

C 언어

  1. C 키워드와 식별자: 실전 가이드
  2. C# 기초: 입출력(Essential Input/Output) 완벽 가이드
  3. C 언어 증감 연산자 마스터하기: 사용법 & 모범 사례
  4. C++ 멀티스레딩 마스터하기: 효율적인 동시 프로그래밍
  5. C++ 배열 마스터하기: 선언, 초기화, 접근, 실전 예제
  6. C# 문자열(String) 마스터: 기초, 연산, 고급 기법 총정리
  7. C언어 malloc() 마스터하기: 실전 예제로 이해하는 동적 메모리 할당
  8. C# 상속과 다형성 마스터하기: 실전 코드 예제
  9. C++ while/do-while 루프: 코드 반복의 마스터키
  10. C++ 연산자 오버로딩 마스터하기: 실전 예제와 모범 사례