C
포인터와 배열
배열의 이름: 포인터
그 값을 바꿀 수 없는 '상수 형태의 포인터'
배열의 시작 주소 값을 의미하며, 그 형태는 값의 저장이 불가능한 상수임.
|
포인터 변수 |
배열의 이름 |
이름이 존재하는가? |
존재o |
존재o |
무엇을 나타내거나 저장하는가? |
메모리의 주소 값 |
메모리의 주소 값 |
주소 값의 변경이 가능한가? |
가능 |
불가능 |
- 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 * 연산이 가능
- 1차원 배열이름의 포인터 형은 배열의 이름이 가리키는 대상을 기준으로 결정
ex)
<포인터를 배열의 이름처럼 사용할 수 있음>
포인터 변수로 할 수 있는 연산은 배열의 이름으로도 할 수 있고,
배열의 이름으로 할 수 있는 연산은 포인터 변수로도 할 수 있음.
포인터 변수 ptr이 배열이름 arr과 동일한 주소 값을 갖도록 하기 위해서 첫 번째 요소의 주소 값을 저장함. (int * ptr=arr;)과 동일한 문장임.
<포인터의 연산>
ptr2 + 2 = 00000020 이 나온것에 의아할 수 있는데, 처음에 초기값 설정한 걸 보면 16진수로 되어있는게 보일 것 이다. 그래서 16진수 형식으로 나와서 20이 나온것이다.
- TYPE형 포인터를 대상으로 n의 크기만틈 값을 증가 및 감소 시, n x sizeof(TYPE) 의 크기만큼 주소 값이 증가 및 감소한다.
7행 *ptr, *(ptr + 1), *(ptr + 2) 출력시 arr[0], arr[1], arr[2] 요소가 출력.
ptr에 저장된 값은 변경되지 않음
9~12행은 포인터 변수 ptr에 저장된 값을 증가 및 감소시키는 연산을 진행하고 있음.
ex) *(++ptr) = 20;
ptr에 저장된 값 자체를 변경
- arr[i] == *(arr+i) //arr[i]는 *(arr+i)와 같다.
배열의 이름과 포인터 변수는 상수냐 변수냐의 차이만 있을 뿐, 사실상 동일함.
Q1) 길이가 5인 int형 배열 arr을 선언하고 이 배열의 첫 번째 요소를 가리키는 포인터 변수 ptr을 선언.
포인터 변수 ptr에 저장된 값을 증가시키는 형태의 연산을 기반으로 배열요소에 접근하면서
모든 배열요소의 값을 2씩 증가시키고 출력.
10~11행의 *ptr += 2; ptr++; 은 *(ptr++) += 2; 로 변환가능
Q2) Q1문제에서 포인터 변수 ptr에 저장된 값을 변경시키지 않고, ptr을 대상으로 덧셈연산을 하여,
그 결과로 반환되는 주소 값을 통해서 모든 배열요소에 접근하여 값을 2씩 증가후 출력.
*(ptr + i) += 2; 는 ptr에 저장된 값은 변경되지 않고 ptr에 있는 값으로 연산만 함.
Q3) 길이가 5인 int형 배열 arr을 선언후 1,2,3,4,5로 초기화, 배열의 마지막 요소를 가리키는 포인터 변수 ptr을 선언.
포인터 변수 ptr에 저장된 값을 감소시키는 형태의 연산을 기반으로 모든 배열요소에 접근,
배열에 저장된 모든 정수를 합하여 출력.
Q4) 길이가 6인 int형 배열 arr을 선언후 1,2,3,4,5,6으로 초기화, 배열에 저장된 값의 순서가 역순이 되도록 변경.
(단, 배열의 앞과 뒤를 가리키는 포인터 변수 두 개를 선언해서 이를 활용하여 저장된 값의 순서를 뒤바꿔야 함)
for문의 i는 그냥 반복수만 나타냄.
한번 반복시 arr[]의 좌우끝이 바뀜.
<나만의 정리>
11번째줄에서 printf("%d ", *ptr+1); 을 보면 위에 8번째 배열과 같이 해당 자리의 수는 변하지 않고 연산만 함.
<정리중 오류>
궁금해서 해봤다.
오류내용
<상수 형태의 문자열을 가리키는 포인터>
마지막에 널 문자가 삽입되는 문자열의 선언방식
1) 배열
ex) char str[] = "merona";
문자열 전체를 저장하는 배열
계속해서 문자 m이 저장된 위치를 가리키는 상태
상수 형태의 포인터
-가리키는 대상 변경x
변수 형태의 문자열
-값의 변경o
2) char형 포인터 변수
ex) char * str = "merona";
메모리상에 자동으로 저장된 묹열 "merona"의 첫 번째 문자를 단순히 가리키고만 있는 포인터 변수
다른위치를 가리킬 수 있음
변수 형태의 포인터
-str이 가리키는 대상을 문자열 "apple"로 변경o
상수 형태의 문자열
-값의 변경x
= but 둘다 문자열의 시작 주소 값을 담고 있다는 측면에서는 동일
12~14번째 줄은 무시됬다.
12행은 문제가 없지만 13행은 문제가 된다. 12행은 값의 내용을 변경 할 수 없기 때문이다.
<포인터 배열>
-포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열
<선언>
int * arr1[20] //길이가 20인 int형 포인터 배열 arr1
double * arr2[30] //길이가 20인 double형 포인터 배열 arr2
<문자열 선언>
char * strArr[3]; //길이가 3인 char형 포인터 배열
char * strArr[3]; = {"apple", "melon", ice"};
-큰따옴표로 묶여서 표현되는 문자열은 그 형태에 상관없이 메모리 공간에 저장된 후 그 주소 값이 반환됨.
//겁나게 헷갈린다.
'언어 > C' 카테고리의 다른 글
[C] sin/cos 함수그리기 (1) | 2018.10.28 |
---|---|
[C] 포인터와 함수 (0) | 2018.10.10 |
[C] 포인터 (0) | 2018.10.06 |
[C] 1차원 배열 (0) | 2018.10.02 |
[C] 반복문 (C언어정석_5) (0) | 2018.10.01 |
댓글