배열의 이름은 무엇을 의미하는가?
#include <stdio.h>
int main(void) {
int arr[] = { 10,20,30 };
printf("배열의 이름 : %p\n", arr);
printf("배열의 1번째 요소의 주소 : %p\n", &arr[0]);
printf("배열의 2번째 요소의 주소 : %p\n", &arr[1]);
printf("배열의 3번째 요소의 주소 : %p\n", &arr[2]);
return 0;
}
배열의 값과 첫번째 요소의 주소값이 같음을 알 수 있습니다.
배열의 이름은 포인터 입니다.
단 그 값을 변경할 수 없는 특별한 상수 형태의 포인터입니다.
#include <stdio.h>
int main(void) {
int arr[] = { 10,20,30 };
int * ptr = arr;
printf("arr의 길이 : %d\n", sizeof(arr)); // 배열은 길이정보가 있다.
printf("ptr의 길이 : %d\n", sizeof(ptr)); // 포인터는 길이정보가 없다.
printf("%d, %d\n", arr[0], ptr[0]);
printf("%d, %d\n", arr[1], ptr[1]);
printf("%d, %d\n", arr[2], ptr[2]);
return 0;
}
배열 arr은 주소값을 가지고 있기 때문에 포인터 변수 ptr에 바로 그값을 대입할 수 있습니다.
배열의 이름에는 배열의 길이 정보가 들어있습니다.
포인터 변수도 주소이기 때문에 포인터변수명[첨자]로 배열요소에 접근할 수 있습니다.
배열도 주소이기 때문에 *(간접지정연산자)로 접근할 수가 있습니다.
포인터는 메모리를 대상으로 접근을 위한 * 연산 이외에 증가 및 감소 연산도 가능합니다.
#include <stdio.h>
int main(void) {
int * ptr1 = 0x000010;
double * ptr2 = 0x000010;
printf("ptr1 : %p, ptr1 + 3 : %p \n", ptr1, ptr1 + 3); // 12증가
printf("ptr2 : %p, ptr2 + 3 : %p \n", ptr2, ptr2 + 3); // 24증가
ptr1 = ptr1 + 1; // 4증가
ptr2 = ptr2 - 1; // 8감소
printf("ptr1 : %p \n", ptr1);
printf("ptr2 : %p \n", ptr2);
return 0;
}
포인터는 증가/감소 연산이 가능합니다.
포인터의 증가/감소 자료형의 byte크기 만큼의 step을 가지고 있습니다.
int형 자료형은 1step은 4byte이기 때문에 두번째 인자가 12 증가 하는것을 볼수 있고,
double형은 1step이 8byte이기 때문에 두번째 인자가 24 증가하는 것입니다.
포인터 변수는 말 그대로 변수이기 때문에 그 값이 변경될 수도 있습니다.
#include <stdio.h>
int main(void) {
int arr[] = { 10,20,30,40,50 };
int len = sizeof(arr) / sizeof(arr[0]);
int * ptr = arr;
int i;
printf("arr : %p, ptr : %p\n", arr, ptr);
for (i = 0; i < len; i++) {
printf("arr[%d] : %d, *(ptr+%d) : %d\n", i, arr[i], i, *(ptr + i));
}
return 0;
}
arr[i]은 *(ptr+i)과 같습니다.
1. 정수 5개인 배열을 하나 선언하고 값을 10,20,30,40,50으로 초기화 합니다.
2. 배열을 가리키는 포인터 변수를 선언하고 포인터식으로 접근하여 모든 배열의 값을 5증가시킵니다.
3. 배열의 값을 모두 출력해보세요.
1. 사용자로부터 정수 5개를 입력받아 저장하는 배열 하나를 선언합니다.
2. 배열의 마지막 요소를 가리키는 포인터변수를 선언합니다.
3. 사용자가 처음 입력하는 정수는 마지막 요소에 저장되고, 마지막에 입력하는 정수는 첫번째 요소에 저장되게 합니다.
4. 배열의 값을 출력해보세요.
1. 사용자로부터 문자열을 입력받는 배열을 선언합니다.
2. 그 배열을 가리키는 포인터 변수를 선언합니다.
3. 입력받은 문자열을 포인터 연산을 통해 접근하여 대문자는 소문자로, 소문자는 대문자로 변경하여 출력하는 프로그램을 작성하세요.