배울 때 엄청 헷갈렸던 포인터...(사실 지금도 헷갈림)
1. 포인터
1) 의미 : 변수의 주소를 저장하는 변수
#include <stdio.h>
int main()
{
int *numPtr; // 포인터 변수 선언
int num1 = 10; // int형 변수를 선언하고 10 저장
numPtr = &num1; // num1의 메모리 주소를 포인터 변수에 저장
printf("%p\n", numPtr); // 0055FC24: 포인터 변수 numPtr의 값 출력
// 컴퓨터마다, 실행할 때마다 달라짐
printf("%p\n", &num1); // 0055FC24: 변수 num1의 메모리 주소 출력
// 컴퓨터마다, 실행할 때마다 달라짐
return 0;
}
//출처 : (c언어코딩도장)dojang.io/mod/page/view.php?id=275)
- 포인터 선언 방식
int *ptr;
ptr = &a;
int *ptr = &a;
❗ 주의사항
int a = 10;
int *ptr = &a; //ptr이라는 포인터는 a의 주소를 저장함
*ptr = 20; //ptr이 가르키는 a의 값을 20으로 바꾼다.
정리해보면
& : 변수의 주소
* : 포인터가 가리키는 주소에 저장된 값
2. 배열과 포인터
1) 배열의 크기
- int 배열을 선언했다면, 배열에 담긴 요소하나하나는 4byte를 가지게 된다.
int arr[5] = {1,2,3,4,5};
int *p = arr; //&arr 아님
for(int i=0;i<5;i++){
printf("%d ",p+i);
}
}
답 출력 : 5240664 5240668 5240672 5240676 5240680(주소는 컴파일할때마다 달라진다.)
❗ 주소가 4씩 차이가 나는 것을 알 수 있다.
2) 헷갈리는 것(int *ptr = arr일 때)
① ptr = &arr[0](배열의 주소)
② *ptr = arr[0](배열의 값)
③ ptr +1 = ptr에 sizeof(*ptr)을 더한 값
// 참고사항 : arr[i] = *(arr+i) = *(ptr +i) = *(i+ptr) = i[ptr]
왜냐하면 컴퓨터는 a[b]를 *(a+b)로 받아들이기 때문
④ 2차원 배열에서 string[i] = &string[i][0] 이다.
* 이차원 배열에서의 포인터
int arr[3][3] = {0} 이라고 할 때,
&arr = arr[3][3] 전체배열의 주소값을 이야기 함 = arr[0][0]의 주소값
arr = &arr[0] 이므로 0행의 배열의 주소를 이야기함 = arr[0][0]의 주소값
*arr = *&arr[0] = arr의 0행이 가르키는 값을 이야기함 = arr[0][0]의 주소값
행을 출력하는 건 그 행의 첫번 째 요소의 주소값을 출력하는 것과 같다.
3. 배열포인터 (2와 다름)
1) 의미 : 특정 사이즈의 배열을 가르키는 포인터
2) 선언 방법 :
int arr[3] = {1,2,3};
int (*ptr)[3]; //길이가 3인 int형 배열을 가르키는 포인터를 선언
ptr = &arr;
- 궁금할 사항 :
ptr[1]을 출력 시 arr[1]의 주소값 출력,
(*ptr)[1]을 출력 시 arr[1]의 값(2) 출력
*ptr[1]을 출력 시 잘못된 데이터를 읽고 있다고 경고가 뜹니다.
4. 포인터 배열
1) 의미 : 배열의 요소가 포인터로 이루어져 있음
2) 선언 방법 : 배열 포인터에서 가로만 빼주면 된다.
int *ptr[4];
//사용방법
int a =10;
ptr[0] = &a
하면서도 헷갈려요... 언제쯤 완벽하게 이해할련지...
'Major > C&C++' 카테고리의 다른 글
[C언어] 포인터로 두 변수의 값 서로 바꾸기 (0) | 2021.04.08 |
---|---|
[C언어] 구조체 (0) | 2021.04.08 |
[C언어] 문자/문자열 입력받기(여러개 입력받기) (8) | 2021.04.04 |
[C언어 복습] 문자열 (0) | 2021.02.01 |
[C언어 복습] 배열 (0) | 2021.02.01 |