-
포인터와 배열1프로그래밍/C, C++ 2019. 4. 21. 23:23
포인터와 배열
포인터는 배열과 정말 많이 쓰인다. 이유는 잘 모르겠지만 ..
아마 배열이 메모리 구조상 연속적으로 되어있고 배열을 함수의 인자로 넘길 수 없어
포인터로 받아서 원하는 작업을 해야되기 때문이라고 생각한다.
배열의 특징
배열의 이름은 배열의 시작주소이다
배열의 첫번째 요소는 배열의 시작주소이다.int arr[4] = {1,2,3,4}; if(&arr[0] == arr) printf("Same!");
배열이 배열전체로 쓰이는 경우는 sizeof함수와 & 연산자가 붙었을때 뿐이다.
int arr[4] = {1,2,3,4}; printf("arr배열의 사이즈 : %d\n", sizeof(arr)); printf("arr 주소 : %x, arr[1] 주소 : %x, arr+1 값 : %x\n", arr, &arr[1], arr+1); printf("&arr의 값 : %x, &arr + 1의 값 : %x\n", &arr, &arr + 1);
실행결과
arr배열의 사이즈 : 16 // 4바이트 * 4 = 16
arr 주소 ּ : 62fe10, arr[1] 주소 : 62fe14, arr+1 값 : 62fe14 // arr + 1 == &arr[1]
&arr의 값 : 62fe10, &arr + 1의 값 : 62fe20 // 차이가 16 -> 배열의 사이즈만큼 난다
배열과 포인터
int arr[4] = {1,2,3,4}; int *p = arr; //배열의 이름이 시작주소
포인터 p가 int형이기 때문에, p에 더하거나 빼면 int의 사이즈인 4바이트만큼 증가, 감소한다.
그래서 p + 1와 &arr[1]의 주소가 같다.참조연산자
참조연산자는 *인데, 선언 시에는 포인터로 쓰이고, 포인터에 *를 쓰면 주소에 있는 값을 읽는다.
읽을 때는 선언한 자료형으로 읽는다.//위의 코드 printf("*p : %d\n", *p); // 1 printf("*(p+1) : %d\n", *(p*1)); // 2
p가 가리키고 있는 값는 arr의 시작주소이자 &arr[0]이다!
그래서 읽을 때, arr[0]을 읽는다 -> *와 &은 서로 상쇄가 된다.
p = &arr[0]; 양번에 *을 붙이면 *p = *&arr[0] -> *p = arr[0] = 1이 나온다
p + 1 = &arr[1]; 위와 같이 * 붙이면 *(p+1) = arr[1] = 2그렇다면 p[0]의 값은 무엇인가!?
댓글