20140319 - 포인터2 메모리 관련 표현법

c언어 2014. 3. 19. 16:56 Posted by Owen.K

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

                  메모리의 주소 값을 저장하기 위한 변수이다.

                  모든 자료형은 type에 대한 포인트를 가진다.(4byte 고정)

 

포인터 변수의 선언

int * pnum1;                 - int *int형 변수를 가리키는 pnum1의 선언을 의미.

double * pnum2;          - double *double형 변수를 가리키는 pnum2의 선언을 의미.

unsigned int * pnum3;

                                    - unsigned int *unsigned int형 변수를 

   가리키는 pnum3의 선언을 의미.

 

 

변수의 주소 값을 반환하는 & 연산자

& 연산자의 피연산자는 변수이어야 하며, 상수는 피연산자가 될 수 없다. 변수의 자료형에 맞지 않는 포인터 변수의 선언은 문제가 될 수 있다.

ex)

int main()

{

        int num1 = 5;

        double * pnum = &num1; //일치하지 않음

}

 

int형 변수의 주소 값을 double형 포인터 변수에 저장하거나 double형 변수의 주소 값을 int형 포인터 변수에 저장하는 것은 잘못된 것이다. 비록 컴파일 에러는 발생하지 않지만 워닝이 뜬다.

 

포인터가 가리키는 메로리를 참조하는 *연산자.

ex)

int main()

{

    int num=10;

    int * pnum=#              //포인터 변수 pnum이 변수 num을 가리키게 하는 문장

    *pnum=20;                         //pnum이 가리키는 변수에 20을 저장

    printf("%d", *pnum);          //pnum이 가리키는 변수의 주소에 있는 값을

                                             // 부호 있는 정수로 출력.

}

 (예제1)

 main1

 

Intel 뒤에서부터 들어가기 때문에 산술은 빠르지만 대소비교는 느리다. -Little endian

 

12

34

56

78

78

56

34

12

 

super 앞에서부터 들어가기 때문에 산술은 느리지만

대소비교(논리연산)는 빠르다. - Big endian

 

12

34

56

78

12

34

56

78

 

int main()

{

int iNum = 0x12345678;

unsigned char *p =

(unsigned char *)&iNum;

*p = 0xAA;

return 0;

}

unsigned 선언 시 FFFF..사라짐 양의 정수라서.



(예제1)



(문제1)

(문제2)

(예제2)

char형 1byte 한 칸씩 이동                                        short형 2byte 두 칸씩 이동


(예제3)

char형 1byte 한 칸씩 이동