지금까지 수업 시간에 배웠던 내용중 나한테 제일 어려운 부분을 지금 배우는중,,,,
포인터 이자식 굉장히 어렵군... 일단 내가 오늘 이해한 것을 보여주지! 1차 배열 포인터 !!!!!
포인터를 사용할 때 두 가지 연산자(?)가 사용됨.
1. & : 피연산자의 주소값
2. * : 그 주소가 가리키는 값
★ 간단한 예시
int num = 7; // 정수형 변수 num 선언 및 7로 초기화
int *pnum; // 포인터 변수 pnum, 앞에 int는 int형 변수의 주소를 저장한다는 말
pnum = # // num의 주소값을 포인터 변수 pnum에 저장
printf("num : %d\n", num);
printf("num의 주소 : %p\n", &num);
printf("pnum이 가리키는 값(*pnum) : %d\n", *pnum);
printf("pnum : %p\n", pnum);

정수형 변수 num의 주소값과 pnum의 값이 같음.
포인터 변수 pnum이 가리키는 값 (= *pnum) 은 num의 값이기 때문에 7임.
int num1 = 100;
int *pnum; // 포인터 변수 pnum 선언
pnum = &num1; // 포인터 변수 pnum에 num1의 주소값 저장
*pnum += 30; // 포인터 변수 pnum이 가리키는 값에 30을 더해라
printf("num1 : %d\n", num1);

pnum이 가리키는 값(= *pnum = num1)에 30을 더함 => num1 = 100 + 30 = 130
int num1 = 10;
int num2 = 20;
int *ptr1 = &num1; // 포인터 변수 ptr1에 num1의 주소값 저장
int *ptr2 = &num2; // 포인터 변수 ptr2에 num2의 주소값 저장
int *tmp;
*ptr1 += 10; // ptr1이 가리키는 값에 10 더함
*ptr2 -= 10; // ptr2가 가리키는 값에 10 뺌
tmp = ptr1;
ptr1 = ptr2;
ptr2 = tmp;
printf("ptr1 : %d\n", *ptr1);
printf("ptr2 : %d\n", *ptr2);

ptr1이 가리키는 값(= *ptr1 = num1)에 10을 더함.
ptr2가 가리키는 값(= *ptr2 = num2)에 10을 뺌.
이렇게 포인터를 사용하여 두 개의 값을 바꾸는 것도 가능함.
★ 모든 배열 요소 값을 2씩 증가시키는 문제
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;
for (int i = 0 ; i < 5 ; i++)
{
*(ptr+i) += 2;
printf("%d ", arr[i]);
}
printf("\n");
for (int i = 0 ; i < 5 ; i++)
{
printf("%d ", *(ptr+i));
}

arr은 5개의 요소를 갖는 1차 배열임.
배열이름 자체의 주소(?)는 배열의 첫번째 요소의 주소값과 같음.
포인터 변수 ptr에 배열 arr의 주소 저장
ptr + 1 : ptr이 가리키는 주소는 arr의 첫번째 요소 주소임. + 1을 해주면 다음 요소의 주소가 됨.
우리는 (ptr+i)가 가리키는 값에 2씩 더해줘야하기 때문에 *을 붙여야 함.
===> *(ptr + i) += 2;
★ 배열에 저장된 정수의 합 구하기
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = &arr[4];
int sum = 0;
for (int i = 0 ; i <5 ; i++)
{
sum += *(ptr - i);
}
printf("%d\n", sum);

포인터 변수 ptr에 배열 arr의 마지막 요소의 주소(&arr[4])를 저장함.
그러면 (ptr - i)는 배열 arr의 마지막 요소에서부터 0번째 요소까지의 주소가 됨.
우리는 (ptr - i)가 가리키는 값의 합을 구해야하기 때문에, *을 붙여야 함.
===> sum += *(ptr - i);
★ 배열 역순 구하기
int arr[6] = {1, 2, 3, 4, 5, 6};
int *ptr1 = &arr[0];
int *ptr2 = &arr[5];
int tmp;
for (int i = 0 ; i < 3 ; i++)
{
tmp = *(ptr2 - i);
*(ptr2 - i) = *(ptr1 + i);
*(ptr1 + i) = tmp;
}
for (int j = 0; j < 6 ; j++)
{
printf("%d ", arr[j]);
}

배열 arr의 처음 요소와 마지막 요소의 주소를 각각 포인터 변수 ptr1, ptr2에 저장함.
tmp를 사용하여 a, b의 값을 서로 바꾸는 것과 똑같이 코드를 작성함.
배열의 요소가 6개 이므로 3번 반복하여 (0번, 5번), (1번, 4번), (2번, 3번) 요소를 서로 바꿔줌.
이 문제들을 읽고 직접 코딩해보면서 1차 배열의 포인터에 대해서는 어느정도 이해하게 되었음. 2차 배열은 더 어렵겠지,,,,,? 그래도 1차 배열 이해했으니까 괜찮으려나,,,, 걱정걱정,,, 내일은 문자열을 가리키는 포인터에 대해 공부해보려고 함,,, 포인터 이자식 언넝 격파하자!!!!!!! 돌격!!!!!!!!!!!!!!!!
1차 배열 포인터 이해안되시는 분들,,, 제꺼 보고 이해가능 하시려나요 ㅠㅠㅠ 최대한 쉽게 설명해보려고 했는데 흠,,,,,,,,, 처음에는 &랑 *도 뭔지 헷갈리고, %d, %p도 뭘 써야될지 몰랐는데, 알고나니까 1차 배열은 이제 쪼~~~~~끔은 쉽게 다가온다!!!!!!!!!!!!!
주소인지 값인지에 따라서 & / * 잘 구분하기!!
'C > 본수업' 카테고리의 다른 글
[2025.04.01] 이중 포인터 (0) | 2025.04.02 |
---|---|
[2025.03.30] 1차, 2차 배열 함수 전달인자로 사용하기 (0) | 2025.03.31 |
[2025.03.14] Ch.09_함수_자판기 만들기 함수화 (동영상 포함) (0) | 2025.03.14 |
[2025.03.14] Ch.08_문자 입출력과 입력 유효성 검사 (0) | 2025.03.14 |
[2025.03.13] Ch.07_C의 제어몬: 분기와 점프_자판기 만들기 (0) | 2025.03.13 |