Dev

[Dev] 포인터와 배열(Pointer & Array)

너굴먹 2024. 4. 1. 23:17

변수는 컴퓨터 메모리에 저장

이제까지 우리는 변수를 만들어서 사용하였습니다, 만든 변수들은 자료들을 저장하는 역할을 하므로 메모리에 저장됩니다 메모리에서는 각 바이트마다 고유한 주소가 매겨지며 이들의 주소를 사용해 메모리의 각 바이트에 접근할 수 있습니다


포인터(Pointer) 

포인터는 메모리의 주소를 가지고 있는 변수입니다 

int a = 10;       // int형 변수 a 선언
int *p = &a;      // int형 포인터 p는 a의 주소로 선언

*p += 5;       // a = a + 5와 동일

int *p = &a

  • & 연산자는 변수 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, 배열 이름 a는 a[0]의 주소값을 가리킨다

  • 배열의 이름은 첫 번째 요소의 주소로 해석됩니다. 이는 포인터 상수이며, 값을 변경할 수 없습니다
  • 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");

p=m, 문자열 이름 m은 m[0]의 주소를 가리킨다

  • 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