juuuding

CH 13 포인터와 배열 함께 이해하기 본문

C언어/윤성우의 열혈 C

CH 13 포인터와 배열 함께 이해하기

jiuuu 2023. 3. 15. 10:10

 1. 포인터와 배열의 관계

 

1. 배열의 이름은 무엇을 의미하는가

 배열의 이름은 포인터이다. 단, 그 값을 바꿀 수 없는 상수 형태의 포인터이다. "배열의 이름은 배열의 시작 주소 값을 의미하며, 그 형태는 값의 저장이 불가능한 상수이다". 배열과 포인터의 유일한 차이점은 포인터 변수는 변수이지만, 배열의 이름은 가리키는 대상의 변경이 불가능한 상수라는 점이다. 즉 배열의 이름은 '상수 형태의 포인터'이다. 이처럼 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 * 연산이 가능하다. 

 

 

2. 1차원 배열이름의 포인터 형과 배열이름을 대상으로 하는 *연산

 배열의 이름이나 포인터 변수나 둘 다 포인터이기 때문에, 실제로 포인터 변수는 배열의 이름처럼 사용할 수 있다. 즉, 포인터 변수 ptr을 대상으로 ptr[0], ptr[1], ptr[02]와 같이 배열의 형태로 메모리 공간에 접근이 가능하다.

 

 

3. 포인터 배열의 이름처럼 사용할 수도 있다.

 배열의 이름과 포인터 변수는 상수냐 변수냐의 특성 차이만 있기 때문에 서로의 연산이 가능하다.

int main(void){

	int arr[3]={0,1,2};
    int * ptr = &arr[0];
    
    //ptr[0]=0, arr[0]=0
    //ptr[1]=1, arr[1]=1 과 같은 결과 값을 얻을 수 있다.

}

 

 

 

 2. 포인터 연산

 

1. 포인터를 대상으로 하는 증가 및 감소 연산

 "TYPE형 포인터를 대상으로 n의 크기만큼 값을 증가 및 감소 시, n x sizeof(TYPE)의 크기만큼 주소 값이 증가 및 감소한다." 

int main(void){

	int arr[3] = {11, 22, 33};
    int * ptr = arr;	//int *ptr = &arr[0]과 같은 문장
    printf("%d %d %d", *ptr, *(prt+1), *(ptr+2));	//11,22,33 출력

}

 

 

 이로써 *(++ptr)=20; 과 *(ptr+1)=20; 이 의미하는 바는 각각 ptr에 저장된 값 자체를 변경, ptr에 저장된 값은 변경되지 않음이라는 것을 알 수 있다.

 

 

2. 중요한 결론! arr[i] == *(arr+i)

 

 

 

 3. 상수 형태의 문자열을 가리키는 포인터

 

1. 두 가지 형태의 문자열 표현

char str1[] = "My String";
char * str2 = "Your String";

 첫번째는 배열을 기반으로 하는 '변수 형태의 문자열' 선언이고 두번째는 'char형 포인터'로 선언한 것이다. 두 문자열의 할당된 메모리 형태를 비교하면 다음과 같다.

 

두 가지 형태의 문자열 할당

"배열이름 str1은 계속해서 문자 M이 저장된 위치를 가리키는 상태여야 하지만, 포인터 변수 str2는 다른 위치를 가리킬 수도 있다."

char *str = "Your Team";
str = "Our Team";

즉 str2는 변수형태의 포인터이기 때문에 위와 같은 문장이 가능하나 str1은 불가능하다. 그리고 str1은 선언이 되면 문자열은 배열에 저장이 되고 배열을 대상으로는 값 변경이 가능하다. 따라서 str1은 '변수 형태의 문자열'이라 하고 str2는 '상수 형태의 문자열'이라고 한다. 실제로 str2가 가리키는 문자열은 그 내용 변경이 불가능하다. 

 

 

2. 어디서든 선언할 수 있는 상수 형태의 문자열

 큰따옴표로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소 값이 반환된다. 예를 들어 char * str = "Const String";을 선언하고 문자열이 0x1234번지에 있다 가정하면 char *str = 0x1234;와 같고, printf("Show your String");에서 문자열이 0x1234에 있다 가정하면 printf(0x1234)와 같다. 이렇듯 printf 함수는 문자열의 주소 값을 전달 받는 함수이다. WhoAreYou("Hong")의 함수 호출문을 보면, 이 함수의 매개변수 선언이 void WhoAreYou(char *str)이라는것을 짐작할 수 있다.

 

 

 

 4. 포인터 변수로 이뤄진 배열: 포인터 배열

 

1. 포인터 배열의 이해

 char형 포인터 배열은 문자열의 주소 값을 저장할 수 있는 배열이다.

char * strArr[3] = {"simple", "string", "array"};는 char * strArr[3] ={0x1004, 0x1048, 0x2012};의 형태가 되는 것이다. 

 

 

'C언어 > 윤성우의 열혈 C' 카테고리의 다른 글

CH 17 포인터의 포인터  (0) 2023.03.17
CH 16 다차원 배열  (0) 2023.03.16
CH 15 도전! 프로그래밍 2  (0) 2023.03.16
CH 14 포인터와 함수에 대한 이해  (0) 2023.03.15
CH 12 포인터의 이해  (0) 2023.03.15