반응형
포인터와 배열의 관계
배열의 이름도 포인터 (배열의 첫번째 요소부터 가르키고 있음)
(단, 그 값을 바꿀 수 없는 상수 형태의 포인터라고 합니다.)
#include <stdio.h>
int main(void) {
int arr[3] = { 0, 1, 2 };
printf("배열의 이름: %p \n", arr);
for (int i = 0; i < 3; i++) {
printf("%d 번째 요소: %p \n", i, &arr[i]);
}
}
※ 배열 요소가 메모리 공간에 연속적으로 할당되는 것을 확인할 수 있음
arr[i] == *(arr + i)
#include <stdio.h>
int main(void) {
int arr[3] = { 0, 1, 2 };
int* ptr = &arr[0]; // int* ptr = arr;과 동일
for (int i = 0; i < 3; i++) {
printf("%d 번째 요소: %d \n", i, ptr[i]);
}
for (int i = 0; i < 3; i++) {
printf("%d 번째 요소: %d \n", i, *(ptr+i));
}
}
ptr은 int형 포인터 변수이기 때문에 연산시 4byte 증가하여 접근합니다.
즉, n × sizeof(int)의 크기만큼 증가합니다.
일반 포인터 변수 vs 배열의 이름
포인터 변수는 주소 값의 변경이 가능하지만, 배열의 이름은 불가능합니다.
ex) char str[] = "Hello" vs char *str = "Hello"
* 큰 따옴표로 묶어서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소 값이 반환된다.
그렇기 때문에 포인터 변수에 바로 값을 초기화 해주는 형태가 가능 (int형과 같은 경우 X)
배열이름 str[]은 계속 문자열 자장된 위치를 가리키는 상태이어야 하지만,
포인터 변수 *str은 다른 위치를 가리킬 수 있습니다.
But 문자열 원소 변경이 되는 것은 str[] 입니다.
#include <stdio.h>
int main(void) {
char str1[] = "Hello";
char* str2 = "Hello";
// 문자열 원소 변경 시도
str1[0] = 'C';
str2[0] = 'C'; // 컴파일은 문제없지만, 실행 시 Error
printf("%s %s \n", str1, str2);
}
※ 컴파일러 특성에 따라 연산 자체를 무시하거나, 프로그램이 바로 종료되는 경우도 있음
위처럼 값의 변경이 가능도록 선언되는 문자열을 "변수 형태의 문자열"
내용 변경이 되지 않는 *str을 "상수 형태의 문자열" 라고 합니다.
ex) printf("Hello World")는 printf(char * str) 형태라고 볼 수 있습니다.
포인터 배열: 주소 값 저장이 가능한 배열
#include <stdio.h>
int main(void) {
char* strArr[3] = { "Ho", "So", "Wo" };
printf("%s %s \n", strArr[1], strArr[2]);
}
위의 형태는 main에서도 사용되는 형태입니다.
- char형 포인터 변수로 이뤄진 1차원 배열의 이름을 인자로 전달받습니다.
int main(void) {...}
int main(int argc, char* argv[])
반응형
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] 다차원 배열과 포인터 관계 (0) | 2021.03.20 |
---|---|
[C] Call-by-value & Call-by-reference (0) | 2021.03.20 |
[C] 동적 할당 필요성 (0) | 2021.03.20 |
[C] [전처리기] #ifdef (0) | 2021.03.20 |
[C] calloc( ) & realloc( ) (0) | 2021.03.20 |
댓글