포인터
목차 포인터란? 배열이란? 포인터 배열 AND 배열 포인터 선언부를 예제에서 생략!
포인터란 ? 포인터는 주소를 저장하는 변수이다. C 언어의 가장 대표적인 특징 중 하나이다. 사용하고자 하는 대상에 변수명을 통하지 않고 직접 접근 가능 포인트 변수의 크기는 모두 4바이트(byte)이다.
포인터 변수의 선언 ! 자료형 : 자료형을 지정, 뒤에 * 연산자를 붙인다. 포인터 변수 이름 : 주소를 저장할 변수의 이름을 지정한다. NULL 포인터 설정 : 포인터 변수 선언 시 NULL로 초기화함.
예제 1 c == *&c == *cp 같은 메모리 공간의 이름 char c='A'; char* cp=NULL; cp=&c; printf("%x %c %c \n", &c, c, *&c); printf("%x %x %x \n", &cp, cp, *&cp); printf("%c \n", c); printf("%c \n", *cp); return 0; c == *&c == *cp 같은 메모리 공간의 이름
예제 2 int a=0, b=0, c=0; int* ip=NULL; ip=&a; *ip=10; printf("%d %d %d %d\n", a, b, c, *ip); ip=&b; *ip=20; ip=&c; *ip=30; return 0;
배열 하나의 대표 변수 명에 여러 개의 동일한 형을 갖는 데이터를 기억하기 위한 자료 구조 나머지는 예제를 보면서 이해해 봅시다 ^^
1차원 배열 *(array+i) == *&array[i] == array[i]는 값을 나타낸다 array == array+i == &array[i]는 주소를 나타낸다 배열 이름은 배열의 시작 주소이다
One 차원 배열 예제 one 1 int array[3]={10, 20, 30}; printf("%x %x %x \n", array, array+0, &array[0]); printf(“%x %x \n",array+1, &array[1]); printf(“%x %x \n",array+2, &array[2]); printf("%d %d %d \n", sizeof(array), sizeof(array+0), sizeof(&array[0])); return 0; } 배열의 이름은 ‘배열의 시작 주소’ array == array+0 ==&array[0] array+1 ==&array[1] array+2 ==&array[2]
EX2) int array[3]={10, 20, 30}; printf("%d %d %d \n",*(array+0), *&array[0], array[0]); printf("%d %d %d \n",*(array+1), *&array[1], array[1]); printf("%d %d %d \n",*(array+2), *&array[2], array[2]); return 0; }
2차원 배열 *(array+i) == *&array[i] == array[i] 는 주소를 나타낸다
2차원 배열 예제 int array[3][3]={10,20,30,40,50,60,70,80,90}; printf("%x %x %x \n", &array[0][0], &array[0][1], &array[0][2]); printf("%x %x %x \n", &array[1][0], &array[1][1], &array[1][2]); printf("%x %x %x \n", &array[2][0], &array[2][1], &array[2][2]); printf("---------------\n"); printf("%d %d %d \n", *&array[0][0], *&array[0][1], *&array[0][2]); printf("%d %d %d \n", *&array[1][0], *&array[1][1], *&array[1][2]); printf("%d %d %d \n", *&array[2][0], *&array[2][1], *&array[2][2]); return 0; }
Pointer 배열 배열에 메모리 주소 값을 저장할 수 있는 배열 즉, 포인터를 요소로 지니는 배열이다. 예제 들어가기 전에 하나만 봅시다. Int *arr[5]; arr1이라는 이름의 배열을 선언하고 있다. 배열의 길이는 10이고, 요소의 자료형은 int형 포인터(int*)이다.
예제 one ! int a=10, b=20, c=30; int* arr[3]={&a,&b,&c}; printf("%d\n", *arr[0]); printf("%d\n", *arr[1]); printf("%d\n",*arr[2]); return 0; } 배열의 요소가 포인터이다. arr[0]은 10을 가리키고 a의 주소값을 가진다. arr[1]은 20을 가리키고 b의 주소값을 가진다. arr[2]는 30을 가리키고 c의 주소값을 가진다. 연산자 * 를 만나 각자 가지고 있는 주소의 값을 출력한다. 문자열 상수는 메모리 공간에 저장이 되면, 그 순간 문자열 상수의 주소값이 반환된다.
예제 two !
배열 포인터 배열을 가리키는 포인터. 임의의 정의한 2개의 배열 포인터의 타입이 같다면, 포인터 연산에 의해 증가 및 감소되는 값의 크기가 일치한다.
Ex1) int arr1[3][2]; int arr2[2][3]; printf("arr1 : %d\n",arr1); printf("arr1+1 : %d\n",arr1+1); printf("arr1+2 : %d\n",arr1+2); printf("arr1 : %d\n",arr2); printf("arr1+1 : %d\n",arr2+1); printf("arr1+2 : %d\n",arr2+2);
포인터 배열 , 배열 포인터 차이 》 》 포인터 배열 : 각각의 포인터마다 관계가 없는 서로 다른 주소 값을 가리킬 수 있다. 》 》 배열 포인터 : 연속적인 메모리만 가리킬 수 있다. ?
- The END -