c언어 개념 정리와 문제 풀이를 통해 알고리즘 수업을 준비하는 과정입니다. 그동안 수강했던 c언어 수업 자료와 윤성우의 열혈 C 프로그래밍의 내용을 포함해 저에게 기록할 가치가 있는 내용이 담겨 있습니다.
배열의 이름의 의미
배열의 이름도 포인터다.
단, 그 값을 바꿀 수 없는 '상수 형태의 포인터'이다. '포인터 상수'라고도 한다.
배열의 이름은 배열의 시작 주소 값을 의미하며, 포인터 변수와 달리 주소 값의 저장, 변경이 불가능하다.
앞 포스팅에서 다음과 같은 내용을 언급했는데, 여기서의 '상수 형태의 포인터'를 말한다.
'포인터'는 '변수 형태의 포인터'와 '상수 형태의 포인터'를 어우르는 표현이다. 근데 포인터와 관련된 이야기라면 대부분이 포인터 변수의 얘기이므로, 포인터라 하면 우선적으로 포인터 변수를 연상하면 된다.
배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 * 연산이 가능하다.
포인터를 배열의 이름처럼 사용할 수도 있다.둘 다 잘 사용하지는 않지만 포인터 이해에 중요하다.
포인터 연산
포인터 변수에 +1을 할 때 1의 의미는 포인터 형의 사이즈 크기만큼이다.int형 포인터를 대상으로 1을 증가시키면 4가 증가하고double형 포인터를 대상으로 1을 증가시키면 8이 증가한다.
*(++ptr) = 20; ptr에 저장된 값 자체를 변경*(ptr+1) = 20; ptr에 저장된 값은 변경되지 않음
위의 두 문장 모두 현재 ptr이 가리키는 위치에서 4바이트 떨어진 메모리 공간에 20을 저장하는 문장이다.
연산 이후 포인터 변수 ptr의 상태에 차이가 있다.
첫 번째 문장은 ptr에 저장된 값이 4만큼 증가한다.
두 번째 문장은 ptr에 저장된 값이 증가하지 않고, 증가된 값을 연산의 결과로 얻어서 * 연산을 진행할 뿐이다.
arr[i] == *(arr+i)
위의 식이 중요한 결론이다. 위의 식에서 arr은 배열의 이름이든, 포인터 변수이든 다 성립한다.
상수 형태의 문자열을 가리키는 포인터
char str1[] = "my tistory"; '변수 형태의 문자열'
char * str2 = "your tistory"; '상수 형태의 문자열'
첫 번째 문자열은 배열에 저장되고, 배열을 대상으로는 값의 변경이 가능하다. 문자열의 내용 일부를 변경할 수 있다.
두 번째 문자열은 내용 변경이 불가능하다. 문자열을 한 덩어리라고 보면 된다.
이렇게 선언하면, 메모리 공간에 문자열 "your tistory"가 저장되고, 문자열의 첫 번째 문자 y의 주소 값이 반환된다.
그리고 그 반환 값이 포인터 변수 str2에 저장된다.
배열 이름 str1은 계속해서 문자 m이 저장된 위치를 가리키는 상태여야 하지만, 포인터 변수 str2는 다른 위치를 가리킬 수 있다. str1은 포인터 상수, str2는 포인터 변수로 이해하면 된다.
어디서든 선언할 수 있는 상수 형태의 문자열
char * str = "hello";
이 형태로 선언하는 문자열은 상수 형태의 문자열이라고 했다. 위 문장이 실행되면 먼저 문자열이 메모리 공간에 저장된다.
그리고 그 메모리의 주소 값이 반환된다. 문자열이 0x1234에 저장되었다고 가정하면, 위의 문장은 문자열이 저장된 후에 다음의 형태가 된다.
char * str = 0x1234;
그래서 포인터 변수 str에는 문자열의 주소 값 0x1234이 저장되는 것이다.
포인터 배열
포인터 변수로 이뤄진 배열, 주소 값의 저장이 가능한 배열을 말한다.
int * arr[20]; int형 포인터 변수 20개로 이뤄진 arr 배열
char * strArr[3]; char형 포인터 변수 3개로 이뤄진 strArr 배열 = 문자열 배열
문자열의 주소 값을 저장할 수 있는 배열이라 문자열 배열로 불리는 것이다.
큰 따옴표로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소 값이 반환된다.
포인터 배열은 가리키는 대상의 차이는 있지만 다른 메모리 공간을 가리킨다는 점에서 동일하다.
'Algorithm > C' 카테고리의 다른 글
[c언어 개념] #7 포인터 대상의 const 선언 (0) | 2022.07.20 |
---|---|
[c언어 개념] #6 포인터와 함수 (0) | 2022.07.20 |
[c언어 개념] #4 포인터의 이해 (0) | 2022.07.20 |
[c언어 문제] #3 난수 배열 정렬, 선택정렬 알고리즘 (0) | 2022.05.17 |
[c언어 문제] #2 사이클 숫자들, 사이클 길이 출력 (0) | 2022.05.04 |