변수는 컴퓨터 메모리에 저장
이제까지 우리는 변수를 만들어서 사용하였습니다, 만든 변수들은 자료들을 저장하는 역할을 하므로 메모리에 저장됩니다 메모리에서는 각 바이트마다 고유한 주소가 매겨지며 이들의 주소를 사용해 메모리의 각 바이트에 접근할 수 있습니다
포인터(Pointer)
포인터는 메모리의 주소를 가지고 있는 변수입니다
int a = 10; // int형 변수 a 선언
int *p = &a; // int형 포인터 p는 a의 주소로 선언
*p += 5; // a = a + 5와 동일
- & 연산자는 변수 a의 주소를 나타냅니다.
- p는 a의 주소가 저장된 포인터 변수입니다
- *p는 포인터 p가 가리키는 주소에 저장된 값, 즉 a의 값인 10을 의미합니다
- *p += 5; 는 포인터 p가 가리키는 변수 a의 값을 5 증가시킵니다
배열과 포인터
배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같습니다
따라서 배열의 이름은 포인터 상수(constant pointer)입니다.
int *p, a[4]={10, 20, 30, 40}; // int형 배열 a, 포인터 p 선언
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]); // 배열 요소 출력 (index)
p=a;
printf("%d %d %d %d\n", *p, *(p+1), p[2], *(p+3)); // 배열 요소 출력 (pointer)
- 배열의 이름은 첫 번째 요소의 주소로 해석됩니다. 이는 포인터 상수이며, 값을 변경할 수 없습니다
- p = a;에서 p는 배열 a의 첫 번째 요소인 a[0]의 주소를 가리킵니다
- 포인터를 사용하여 배열의 요소에 접근할 수 있습니다. *(p+1)은 a[1]의 값을 의미합니다
- 배열과 포인터는 밀접한 관련이 있으며, 포인터를 사용하여 배열의 요소에 효율적으로 접근할 수 있습니다
문자열과 포인터
문자열은 문자의 배열로 표현됩니다
문자열을 나타내는 포인터는 배열의 이름과 마찬가지로 해당 문자열의 첫 번째 문자의 주소를 가리킵니다
char *p = "Hello"; // 문자열을 가리키는 포인터 p
char m[]= "world"; // 문자열을 저장할 배열 m[6] = {'w', 'o', 'r', 'l', 'd', '\0'}
printf("%s %s\n", p, m);
p = m; // hello 문자열을 가리키는 포인터 p = 배열 m의 첫 번째 주소
printf("%s\n", p);
while (*p) // p가 가리키는 문자가 '\0'이 아닐 때까지 반복
putchar(*p++);
printf("\n");
- char *p = "Hello" 에서 p는 문자열 "Hello"의 첫 번째 문자인 'H'의 주소를 가리킵니다
- 문자열을 가리키는 포인터를 다른 문자열로 변경할 수 있습니다. p = m;에서 m은 문자 배열을 가리키는 포인터이며, 문자열 "world"의 첫 번째 문자 'w'의 주소를 가리킵니다.
- while (*p)는 포인터 p가 가리키는 위치의 문자가 널 종료 문자('\0')가 아닌 경우에만 반복합니다. 이를 통해 문자열의 끝까지 순차적으로 문자를 출력합니다
- putchar() 함수는 한 문자를 표준 출력에 출력하는 함수입니다. *p++는 포인터 p가 현재 가리키는 문자를 출력한 후에 포인터를 다음 문자로 이동시킵니다
https://www.tcpschool.com/c/c_pointerArray_relation
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com