포인터 연산
TYPE형 포인터를 대상으로 n의 크기만큼 값을 증가 및 감소 시, n * sizeof(TYPE)의 크기 만큼 주소 값이 증가 및 감소
#include <stdio.h>
int main(void)
{
int arr[3]={11, 22 ,33};
int * ptr=arr; // int * ptr=&arr[0]과 같은 문장
printf("%d %d %d \n", *ptr, *(ptr+1), *(ptr+2));
printf("%d ", *ptr); ptr++; // printf 함수 호출 후, ptr++ 실행
printf("%d ", *ptr); ptr++;
printf("%d ", *ptr); ptr--;
printf("%d ", *ptr); ptr--;
printf("%d ", *ptr); printf("\n");
return 0;
}
/* 결과
11 22 33
11 22 33 22 11
*/
중요한 결론! arr[i] == *(arr+i)
상수 형태의 문자열을 가리키는 포인터
두 가지 형태의 문자열 표현
char str1[ ] = "My String"; // 배열의 길이는 자동으로 계산된다.
- 이는 배열을 기반으로 하는 ‘변수 형태의 문자열'
char * str2 = "Your String";
이렇게 선언을 하면 메모리 공간에 문자열이 저장되고, 문자열의 첫 번째 문자
Y의 주소 값이 반환반환 값이 포인터 변수
str2에 저장
배열 이름 str1은 계속해서 문자 M이 저장된 위치를 가리키는 상태이어야 하지만 포인터 변수 str2는 다른 위치를 가리킬 수 있습니다.
#include <stdio.h>
int main(void)
{
char str1[]="My String"; // 변수 형태의 문자열
char * str2="Your String"; // 상수 형태의 문자열
printf("%s %s\n", str1, str2);
str2="Our String"; // 가리키는 대상 변경
printf("%s %s\n", str1, str2);
str1[0]='X'; // 문자열 변경 성공!
// str2[0]='X'; -> 실행 시 오류로 프로그램 종료 됌. // 문자열 변경 실패!
printf("%s %s\n", str1, str2);
return 0;
}
/* 결과
My String Your String
My String Our String
Xy String Our String */
포인터 변수로 이뤄진 배열: 포인터 배열
포인터 배열의 이해
- 포인터 배열: 포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열
int * arr1[20]; // 길이가 20인 int형 포인터 배열 arr1
double * arr2[30]; // 길이가 30인 double형 포인터 배열 arr2
#include <stdio.h>
int main(void)
{
int num1=10, num2=20, num3=30;
int * arr[3]={&num1, &num2, &num3};
printf("%d\n", *arr[0]);
printf("%d\n", *arr[1]);
printf("%d\n", *arr[2]);
return 0;
}
/* 결과
10
20
30 */
문자열을 저장하는 포인터 배열
char * strArr[3];
#include <stdio.h>
int main(void)
{
char * strArr[3]={"Simple", "String", "Array"};
printf("%s\n", strArr[0]);
printf("%s\n", strArr[1]);
printf("%s\n", strArr[2]);
return 0;
}
/* 결과
Simple
String
Array */