C혼공일기 4일차 (포인터)
1/24 - 포인터
오늘부터 코드를 git 리포지토리에 연결하시오.. (했듬!!!)
https://github.com/codenameVien/C_HONGONG
주소 = 메모리 공간의 '시작' 주소
%u : 부호없는 10진수 출력
%p : 16진수 출력 (주소 전용 변환 문자)
int형 주소 : ㅇㅇ번지 ~ ㅇㅇ번지+3 (4바이트)
double형 주소: ㅇㅇ번지 ~ ㅇㅇ번지+7 (8바이트)
char형 주소: ㅇㅇ번지 (1바이트)
pa = &a; 에서
만약 변수 a가 메모리 100번지부터 103번까지 할당되었다면 주소값 100이 pa에 저장됨. (시작 주소가 저장됨!!!!)
*pa=10; == a=10;
(*pa도 변수 a와 마찬가지로 = 의 왼쪽에 온다면 변수의 저장공간으로, 오른쪽에 온다면 pa가 가리키는 변수의 값으로 사용됨)
scanf("%d", &a); == scanf("%d",pa);
x -> y (x는 y를 가리킨다)
x는 포인터, 변수 y의 '시작' 주소를 저장
포인터 p
p : 주소저장 (&변수, p는변수임)
*p : 변수값 저장 (변수, psms 변수임)
const 예약어 : 가리키는 변수의 값을 포인터를 통해서 바꿀 수 없게 (해당 변수를 통해서는 얼마든지 값 변경 가능)
즉!!! 포인터 선언초기화 시 const를 사용 했다면 간접참조불가, 직접참조 가능
주소 vs 포인터 (276p)
주소 : 할당된 메모리 저장공간의 '시작' 주소 값, 특정 변수의 주소값은 변경되지 않음 (상수)
포인터 : 그 주소 값을 저장하는 또다른 메모리 공간! 즉 얘도 특별한 변수임 (변수)
ex)
int a,b;
int *p;
p = &a; // p->a 이도록 설정
p = &b; // p->b 이도록 설정
이때 변수 a의 주소는 100이고, b의 주소는 200으로 프로그램 실행중에는 그 값이 바뀌지 않음
그러나 포인터 p는 a, b 중 어떤 주소를 대입하냐에 따라 가리키는 변수가 바뀜
변수 a, 포인터 pb, pa 일 때,
pa = pb = &a;
처럼 pa와 pb에 모두 a의 주소 저장 가능 ( 하나의 변수를 동시에 가리키기 OK)
also
pa = pb; 포인터끼리 대입 가능 (포인터가 가리키는 값 주는겨)
but
&a = &b; 처럼 주소를 바꾸는 건 불가능!!!! (주소 is 상수)
포인터는 가리키는 변수의 자료형이 같을때만 대입해야함
int형 포인터는 int 끼리, db는 db끼리..
but 형변환하면 다른거여도 가능
double a= 3.4;
double *pd = &a;
int *pi;
pi = (int*)pd; //pd의 값을 형변환해 pi에 대입
함수에서 선언된 변수명은 사용 범위가 함수 내부로 제한
286p 함수에 변수값을 인수로 주는 경우 그것은 main함수에서 정의된 변수의 복사본
288p 1번 2번 3번 문제 개념 헷갈릴때 보기
289p 실전예제 Re