챌린지 | 혼자 공부하는 C언어 |
---|---|
진도 | Chapter 09 |
기본미션 | 포인터의 핵심 내용을 정리하고 공유하기 |
메모리 주소의 출력 변환 문자
- 주소는 보통 16진수로 표기
- 전용 변환 문자인 %p를 사용해 주소 출력
- %p: 주소값의 데이터 크기에 따라 자릿수를 맞춰 16진수 대문자로 출력
ex. 시스템에서 주소 값 자체를 4바이트로 처리. 16진수 한 자리는 4비트에 해당하므로 주소 값 10번지는 0000000A와 같이 16진수 8자리로 출력.
#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;
}
포인터에 const를 사용하는 이유
- 변수 a는 어디까지나 포인터를 통해서만 바꿀 수 없으며 변수 a 자체를 사용하면 얼마든지 바꿀 수 있다.
- 포인터에 const를 사용하는 대표적인 예? 문자열 상수를 인수로 받는 함수
: 문자열 상수는 값이 바뀌면 안되는 저장 공간. 함수의 매개변수를 통해 값을 바꿀 수 없도록 매개 변수로 선언된 포인터에 const 사용.
규칙 1. 포인터는 가리키는 변수의 형태가 같을 때만 대입해야 한다.
포인터끼리 대입 연산을 수행하면 여러 개의 포인터로 같은 데이터를 다루는 것이 가능하다. (but, 규칙을 지키지 않는 대입 연산은 그 결과 예상 X)
규칙 2. 형 변환을 사용한 포인터의 대입은 언제나 가능하다.
포인터가 가리키는 자료형이 다른 경우라도 형 변환 연사자를 사용하면 경고 메시지 없이 대입할 수 있다.
1 포인터를 사용하기 위해서는 여러 과정을 거쳐야 한다. (추가적인 변수 선언, 주소 연산/간접 참조 연산 등 각종 연산 수행)
2. 따라서 포인터를 일부러 즐겨 사용할 필요는 없다.
3. 임베디드 프로그래밍을 할 때 포인터가 반드시 필요하다.(메모리에 직접 접근 or 동적 할당한 메모리 사용)
임베디드 프로그래밍이란?
임베디드 시스템(Embedded System : 내장형 시스템)을 제어하기 위한 프로그램. 오늘날 만든느 거의 모든 생활 기기에서 특정 기능을 제어하기 위해 구현됨.