코드네임 :

C 혼공일기 5,6일차 (포인터와 배열) 본문

⚙️Computer System/C

C 혼공일기 5,6일차 (포인터와 배열)

비엔 Vien 2024. 1. 25. 19:08

1/25 - 포인터와 배열  ... 하 어렵다

 

배열명 = 첫번째 배열 요소의 주소값

주소 + 정수 == 주소 + (정수 * 주소를 구한 변수의 크기)

 

 

307p 문제1 반쯤 틀려서.. ㅜㅜ

배열명ary = 첫번째 배열요소 ary[0]의 주소

포인터 연산식 *(ary+1) = ary[1] 

(pa가 첫번째 배열요소의 시작 주소를 가리킨다면, (double *pa = ary; 이면)) pa + 2 = 세번째 배열 요소 시작 주소

pa[3] = *(pa+3)

(double *pb = ary +2; 이면,) *pb = ary[2]

pb - pa = ( pb 가 가리키는 시작주소 - pa가 가리키는 시작주소 ) / sizeof(double)

 

 

308p 문제2도 반쯤 틀림..

int ary[5] = {1,2,3,4,5};
int *pa = ary; 
int *pa = ary + 2;

일 때, 올바른 표현방법 고르기

ary[5] (x) : 배열요소가 5개라 index는 0~4만

ary++ (x) : 배열명은 연산을 할수가 없지예

++(*ary) (o) : *ary 는 첫번째 배열요소이므로 ++(*ary)는 그 값을 증가시킴

pb [-2] (o) : 포인터 연산식으로 바꾸면 *(pb-2)가 됨 = 즉 pb의 값(포인터 pb가 가리키는 주소) - 자료형의 크기4 *2

*(pb+3) (x) : pb는 세번째 배열 요소를 가리키므로 pb+3은 할당영역을 벗어남 !!!!!

*(++pa) (o)  : 전위 연산이므로 먼저 pa가 두번째 배열 요소를 가리키도록 하고, 이어서 간접참조연산*으로 두번째 배열 요소 사용

 

 

3번 문제 전위연산이랑 후위연산 중 아무거나 써도 상관 없는게 이해 안돼서 채찍피티한테 물어봄;;ㅋㅋ..

아 보고 바로 이해... 문제 보는 순간 printf문을 for문 으로 봐서,,, 왜.. ++pb가 되는 거지.. 이러고 있었음 ㅋㅋㅋㅋㅋㅋㅋㅋ

printf가 빈칸 아래에 온다면 pb++만 되겠죠? (ㅇㅇ ++pb쓴다면 4번째 배열 요소부터 출력할 것임

 

 

 

 

 

배열을 처리하는 함수 !!

함수로 배열을 처리하려면 포인터가 필요하다요 (함수의 주소가 필요)

배열명을 받을 함수의 매개변수 자리에 포인터가 필요함

함수를 호출할때는 배열명(첫번째 배열요소의 주소)을 주고, 함수의 매개변수로 포인터를 선언( 첫번째 배열요소만 알면 나머지 배열 요소는 포인터 연산으로 모두 사용할 수 있으므로 (포인터에 정수를 더하면 나머지 배열요소의 주소를 알수 있고, 간접참조연산*으로 가리키는 배열요소의 값도 사용가능)

 

311p

 

배열 포인터에 배열요소 표현식을 사용하면 해당 포인터도 마치 배열인 것 처럼 사용 가능!!

정수 연산  pa + 1 // 두번째 배열 요소의 주소 104번지
간접 참조 연산  *(pa + 1) // 두번째 배열 요소 값
배열 요소 표현식  pa[1] // 두번째 배열 요소 값

배열요소 표현식을 사용하는 이유는 배열을 선언한 main 함수 에서만 배열명을 사용할 수 있고, 동일한 배열 데이터를 공유하는 다른 함수에서는 사용할 수 없기에 (312p)

 

314p 여기서 잠깐

 

319p 2번 아깝게(?) 틀려서...!

320p 3번 다시!