포인터
|
*주소 값의 저장을 목적으로 선언되는 포인터 변수*
int * iNum;
(자료형 * 변수이름)
의 방법으로 선언한다. 앞에 int형이 붙었음은 이 포인터가 가르키는 변수가 int형 인 것을 알 수 있다.
"int형 포인터 변수 pnum이 int형 변수 num을 가르킨다."
* 의 명칭 = asterisk (에스터리스크) 에러가 뜨지않고 워링이 뜬다. - 포인터가 비슷하기 때문에 에러가 아닌 워링이뜸 - 포인터 변수에 int * poin = 125; 라고 초기화 할때에는 결국 쓰레기값으로 포인터 변수를 초기화 한 것과 다름없다. **포인터를 제대로 쓸 자신이 없으면 포인터 변수를 처음 초기화 할때에** int * poin = NULL; or int * poin = 0; 으로 초기화 하자. 이는 포인터변수가 아무데도 가리키지 않는다는 뜻이며 보호장치가 없는 운영체제에서도 시스템에 치명적인 영향을 주지 않는다. **포인터는 특성상 다양한 형태의 버그(bug)발생확률을 높이기 때문에 잘 쓰자 ㅠㅠ** |
포인터와 배열
|
배열과 포인터는 유사하다. 포인터도 주소값을 저장하여 가르키는 것이고 배열도 메모리의 주소를 저장하는 변수이다. 배열의 이름은 배열의 시작 주소 값을 의미하며, 그 형태는 값의 저장이 불가능한 상수이다. 즉 포인터변수는 다른 주소값을 가리킬 수 있지만 배열은 그렇지 않다.. 배열의 이름도 포인터이기 때문에 배열의 이름을 피연산자로 하는 * 연산이 가능하다. 그리고 포인터를 배열로 쓰는것도 가능하다. 참고**포인터가 배열 형식으로, 배열이 포인터 형식으로 쓰이는 경우는 거의 없다.** **** arr[1] 와 *(arr+1) 은 같다. &arr[1] 와 (arr+1)도 같다. **** 위의 선언은 문자배열로 자동적으로 배열길이가 계산이 되고, 밑의 포인터는 하나의 문자열로 인식이된다. 즉 위의 코드는 문자배열이며 밑은 문자열이다. 위코드의 장점은 언제든 내용수정이 가능하다는 것이며 단점은 메모리를 많이 차지한다는 것 밑코드의 장점은 메모리를 적게차지하는 것이며 단점은 내용수정이 불가능하다는 것 |
const - 수정금지 위 코드는 문자열에있는 문자의 수를 세는 코드다. 입력받은 인자의 문자열을 수정하면 값이 변경되기 때문에 상황에 맞게 const를 써주는게 좋다. *위 상황처럼 입력받은 인자의 값을 변경시키면 안될 때* 21번째줄에 함수호출로 받은 const가 걸린 인자를 수정하려할 경우 에러가 뜬다. |
포인터배열
|
arr[0]은 arr 100번지의 주소라는 뜻이고 ->주소가 출력 됨 *arr[0]은 arr 100번지의 배열요소가 가리키는 변수에 저장된 값을 출력하는 것 ->주소의 값이 출력 됨 **포인터 배열도 기본 자료형 배열과 별반 다르지 않다. 다만 주소값을 저장할 수 있도록 포인터 변수를 대상으로 선언된 배열이다.** 문자열을 저장하는 포인터 배열 sizeof(arr1) / sizeof(int) 배열의 크기를 알고 싶을때 쓰면된다. arr1의 크기 3 과 int의 바이트수 4 3*4가 sizeof(arr1) 이다. 거기서 나누기 sizeof(자료형) 을 하면 배열의 크기가 나온다. -- 호출받은 함수내에서는 인자로 전달된 배열의 길이를 계산할 수 없다 -- **sizeof 적용문** *** http://maruen.tistory.com/entry/20140325 *** 배열을 함수의 인자로 전달받는 또다른 방법 |
Call-by-value vs. Call-by-reference
|
그냥 함수호출방식을 의미함 call-by-value -값을 전달하는 형태의 함수호출- call-by-reference -주소 값을 전달하는 형태의 함수호출- |
'2014 C > 3월' 카테고리의 다른 글
2014.03.31 (0) | 2014.03.31 |
---|---|
2014.03.28 (0) | 2014.03.28 |
2013.03.26 (0) | 2014.03.26 |
2014.03.26 (0) | 2014.03.26 |
2014.03.25 (0) | 2014.03.25 |