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번째 인자라는 하나의 변수처럼 다루게 되므로 &연산자가 필요한 것이다.