[혼공단 11기] 혼공C 6주차 미션

헤스더·2024년 2월 14일
0
post-thumbnail
챌린지혼자 공부하는 C언어
진도Chapter 09
기본미션포인터의 핵심 내용을 정리하고 공유하기




기본 미션

포인터의 핵심 내용을 정리하고 공유하기

9-1. 메모리의 주소

  1. 우리가 데이터를 넣고 꺼내 쓰는 공간인 메모리는, 그 위치를 식별할 수 있어야 한다.
  2. 프로그램이 사용하는 메모리의 위치는 주소 값으로 식별할 수 있다. (단위: 바이트)
  3. 주소 값은 0부터 시작하고, 바이트 단위로 1씩 증가한다.

9-2. 주소 연산자 : &

  1. 변수가 할당된 메모리 공간의 시작 주소를 알면 그 위치부터 변수의 크기만큼 메로리를 사용할 수 있다!
  2. 주소 연산자 &를 사용해 주소를 구할 수 있다.
  3. 주소 연산자 &는 단항 연산자이며, 변수만을 피연산자로 사용하여 시작 주소를 구한다.

메모리 주소의 출력 변환 문자

  • 주소는 보통 16진수로 표기
  • 전용 변환 문자인 %p를 사용해 주소 출력
  • %p: 주소값의 데이터 크기에 따라 자릿수를 맞춰 16진수 대문자로 출력
    ex. 시스템에서 주소 값 자체를 4바이트로 처리. 16진수 한 자리는 4비트에 해당하므로 주소 값 10번지는 0000000A와 같이 16진수 8자리로 출력.

9-3. 포인터와 간접 참조 연산자 : *

  1. 메모리의 주소는 필요할 때마다 계속 주소 연산을 수행하는 것보다 한 번 구한 주소를 저장해서 사용하는 것이 편리하다! → 포인터
  2. 포인터: 변수의 메모리 주소를 저장하는 변수. 선언할 때 변수 앞에 * 붙여주기

9-4. 여러 가지 포인터 사용해보기

#include <stdio.h>

int main(void)
{
	int a = 10, b = 15, total; // 변수 선언과 초기화
    double avg; // 평균을 저장할 변수
    int *pa, *pb; // 포인터 동시 선언 (여기서 *를 붙이지 않는다면, 포인터가 아닌 일반 변수로 선언됨)
    int *pt = &total; // 포인터 선언과 동시에 주소로 초기화
    double *pg = &avg; // double형 포인터 선언과 초기화
    
    pa = &a; // 포인터 pa에 변수 a의 주소 대입
    pb = &pb; // 포인터 pb에 변수 b의 주소 대입
    
    *pt = *pa + *pb; // a값과 b값을 더해 total에 저장
    *pg = *pt / 2.0; // total 값을 2로 나눈 값을 avg에 저장
    
    printf("두 정수의 값 : %d, %d\n", *pa, *pb); //a 값과 b값 출력
    printf("두 정수의 합 : %d\n", *pt); // total 값 출력
    printf("두 정수의 평균 : %.1lf\n", *pg); // avg 값 출력
    
    return 0;
    
}

9-5. const를 사용한 포인터

  1. const 예약어를 포인터에 사용한다 = 변수의 값을 바꿀 수 없다.

포인터에 const를 사용하는 이유

  • 변수 a는 어디까지나 포인터를 통해서만 바꿀 수 없으며 변수 a 자체를 사용하면 얼마든지 바꿀 수 있다.
  • 포인터에 const를 사용하는 대표적인 예? 문자열 상수를 인수로 받는 함수
    : 문자열 상수는 값이 바뀌면 안되는 저장 공간. 함수의 매개변수를 통해 값을 바꿀 수 없도록 매개 변수로 선언된 포인터에 const 사용.

9-6. 주소와 포인터의 차이

  1. 주소=변수에 할당된 메모리 저장 공간의 시작 주소 값 자체 vs. 포인터= 그 값을 저장하는 또다른 메모리 공간
  2. 주소는 '상수'이고, 포인터는 '변수'이다.

9-7. 주소와 포인터의 크기

  1. 모든 주소와 포인터는 가리키는 자료형에 관계없이 크기가 같다.

9-8. 포인터의 대입 규칙

규칙 1. 포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다.

포인터끼리 대입 연산을 수행하면 여러 개의 포인터로 같은 데이터를 다루는 것이 가능하다. (but, 규칙을 지키지 않는 대입 연산은 그 결과 예상 X)

규칙 2. 형 변환을 사용한 포인터의 대입은 언제나 가능하다.

포인터가 가리키는 자료형이 다른 경우라도 형 변환 연사자를 사용하면 경고 메시지 없이 대입할 수 있다.

9-9. 포인터를 사용하는 이유

1 포인터를 사용하기 위해서는 여러 과정을 거쳐야 한다. (추가적인 변수 선언, 주소 연산/간접 참조 연산 등 각종 연산 수행)
2. 따라서 포인터를 일부러 즐겨 사용할 필요는 없다.
3. 임베디드 프로그래밍을 할 때 포인터가 반드시 필요하다.(메모리에 직접 접근 or 동적 할당한 메모리 사용)

임베디드 프로그래밍이란?

임베디드 시스템(Embedded System : 내장형 시스템)을 제어하기 위한 프로그램. 오늘날 만든느 거의 모든 생활 기기에서 특정 기능을 제어하기 위해 구현됨.





0개의 댓글