본문 바로가기

2014 C/3월

2014.03.27



포인터

 



*주소 값의 저장을 목적으로 선언되는 포인터 변수*


int * iNum;

(자료형 * 변수이름)

의 방법으로 선언한다. 앞에 int형이 붙었음은 이 포인터가 가르키는 변수가 int형 인 것을 알 수 있다.





"int형 포인터 변수 pnum이 int형 변수 num을 가르킨다."


#include <stdio.h>


int main()

{

      int num=7;

      int * pnum;

      pnum = & num;


      return 0;

}


* 의 명칭 = 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[]

 &num1[100번지]

&num2[200번지] 

 &num3[300번지]

 10

20 

30 

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