C언어

3. 포인터와 배열

boseong_Park 2022. 9. 14. 21:40

1. 배열의 이름의 사용법

- 배열의 이름은 첫번째 인자의 주소값에 대한 정보를 담고있다 --> 주소값을 담고있다

- 허나 배열의 이름은 다른 배열 혹은 변수를 가리킬 수 없다 --> 포인터의 상수적 형태를 띤다

- 따라서 scanf에서 배열이 다른 변수처럼 &를 사용하지 않아도 되는 이유가 변수는 &를 통해 주소값을 반환해야되지만, 배열의 이름은 그 자체로 주소값을 가지고 있으므로 &연산자가 필요없는 것이다.

 

※ 포인터변수와 배열의 이름은 변수와 상수라는 차이가 유일한 포인터변수와 배열의 차이점이다.

- 메모리 접근

   --> 둘 다 *연산을 통한 메모리 접근이 가능하다

   --> 둘 다 []를 통해 배열처럼 접근도 가능하다

int arr[] = {1,2,3,4,5};
int* ptr = arr;
ptr[3] = 4; // ptr이 arr의 첫번째 인자의 주소를 가리키고 있으므로 
            // ptr[3]은 arr의 3번째 요소를 가리키게 된다. 
            // 따라서 ptr[3] = 4는 arr의 세번째 요소에 3 대신 4를 넣어주는 연산이다
int arr[10] = {1,2,3,4,5};
*arr = 10; // *연산을 통해 arr배열의 첫번째 인자에 접근하여 값을 10으로 변경
*(arr+1) = 20 // *연산을 통해 arr배열의 두번째 인자에 접근하여 값을 20으로 변경

*(arr+1)은 뒤에서 자세하게 설명함

위와 같은 접근은 자료형과는 무관하게 전부 다 적용된다(문자열 포함)

char arr[] = "hi everyone";
char *ptr;

ptr = &arr[3];

*ptr = 'c';

printf("%s", arr);

위 예시에 대한 결과창

※ 앞서 배열을 소개할 때 배열은 &연산자가 필요없다 했는데 여기선 왜 &arr[3]이 쓰일까?

  --> 배열의 이름은 배열의 첫번째 인자의 주소값을 반환하지만, 배열 하나하나의 인자를 나타내는 arr[i]같은 경우는arr배열의 i번째 인자라는 하나의 변수처럼 다루게 되므로 &연산자가 필요한 것이다.