메모리 어드레스 단위가 워드가 아닌 바이트인 이유.

게이트웨이 vs 라우터

 

게이트웨이 :

현재 네트워크와 다른 네트워크를 연결하는 지점. 추상적인 개념. 고속도로의 톨게이트 개념.

패킷을 변환하는 역할. Ex)음성데이터의 음성코덱을 바꾸는 경우.

즉 두개의 컴퓨터가 네트워크 상에서 서로 연결되려면 동일한 통신 프로토콜을 사용해야함. 따라서 프로토콜이 다른 네트워크 상의 컴퓨터와 통신하려면, 두 프로토콜을 적절히 변환해 주는 변환기가 필요한데, 게이트웨이가 이러한 변환기 역할을 하는 것.

 

라우터 :

게이트웨이가 구현된 물리적 장치패킷의 최적 경로를 찾는 장비. 

종류 :정적,동적 라우팅.

즉 라우터가 게이트웨이를 포함한 개념.

 

Ex)

컴퓨터 게이트웨이는 무엇으로 잡는가?

è  그 컴퓨터의 게이트웨이는 155.230.156.5로 잡아라.

여기 라우터 뭐 쓰나요?

è  여기 라우터xxx 쓰는데, 이 장비는 대역폭이 1Gbits나 된대.

1. 변수의 메모리 주소 구하기

int num1 = 10;


&num1 // 008A7FC, num1의 메모리 주소


2. 메모리 주소를 저장하기 (포인터변수 : 메모리 주소를 저장하는 변수)

구조 : 자료형 *포인터이름;

포인터 = &변수

 char *numPtr; //char형 공간을 가리키는 포인터

int num1 = 10;

numPtr = &num1;


&num1 의 값과 numPtr의 값이 같다. 


[Call by reference, Call by value]

3.메모리 주소가 있는 곳으로 이동해서 값을 가져오기 (역참조 연산자, dereference)


[역참조 연산자로 변수의 메모리 주소에 접근하여 값 가져오기]

구조 : *포인터

int *numPtr;

int num1 = 10;


numPtr = &num1;


*numPtr 은 10 //dereference 연산자로 num1의 메모리 주소에 접근하여 값을 가져옴.


[포인터 변수에 역참조 연산자를 사용한 뒤, 값을 할당하기]

int *numPtr;

int num1 = 10;


numPtr = &num1; 

*numPtr = 20;


*numPtr 값은 20, num1 값도 20


/********************자료형 맞춰주기******************************/

역참조 연산자로 자료형을 바꿀 수 있다.

int *numPtr; 에서 *numPtr처럼 역참조하면, pointer to int 에서 pointer to를 제거한 "int"가 된다. 

따라서 포인터 numPtr에 변수 num1값을 할당하고 싶다면, 역참조 연산자로 자료형을 맞추면 된다 


int *numPtr;

int num1 = 10;


numPtr = num1 //컴파일 warning. 자료형 불일치

: *numPtr = num1;//이렇게 하면 자료형 일치.


&로도 자료형을 맞출 수 있다.

int *numPtr;

int num1;


numPtr = &num1 이렇게 주소값을 가리키는 자료형으로 맞춰준다. //Pointer to int와 address of int는 자료형이 같다. 



4. 다중 포인터

int a = 10;

int *p1 ;

int **p2;


p1 = &a; //a의 주소값을 포인터 변수 p1에 저장.

p2 = &p1 // p1의 주소값(인 a의 주소값이 가리키고 있는 데이터를) 포인터 변수 p2에 저장


printf("%d", **p2 ); 를 출력하면 a의 값인 10이 출력됨.



이렇게 따로따로 선언이 되어있으면 하나씩 풀어가니까 헷갈리지 않은데 

int *p1 = &a;

int **p2 = &p1; 이렇게 선언되어있으면 괜히 당황스럽다.

다중포인터는 헷갈리므로 괄호를 사용하면서 괄호부터 처리하는게 안헷갈리고 좋다.

*(*p2) 이렇게.

1) *(*p2)는 p1의 주소값을 가지고 있다.

2) (*p2)는 p1이 가지고 있는 값을 의미한다.

3) *p1은 a의 주소값을 가지고 있다. 

4) 그러므로 (*p2)는 a의 주소값을 가리킨다.

5) *p1은 a의 주소값을 가지고 있으므로 *(*p2)는 a의 값이 된다. 


call by value를 통해 a의 값을 바꿀수 있다.

*(*p2) = 20; //p2를 이용해서 a가 가지고 있는 값을 20으로 바꾼 것임.

*(*p2) 는 a의 값이므로.




Call by value, Call by reference 참고 사이트 : 

http://11bike.blogspot.kr/2011/04/c-call-by-reference.html

출처 : 코딩도장

https://dojang.io/mod/page/view.php?id=276

포인터의 사이즈는 CPU 사이즈와 관계가 있다.


만약 사용하는 CPU가 64bit인 경우 포인터의 사이즈는 8byte이고 

32bit인 경우 포인터의 사이즈는 4byte이다.


가상 메모리 주소가 64bit의 CPU ->한번에 전송할 수 있는 데이터 : 2^32 (4G)

(=가상주소를 취급하는 어드레스 버스의 크기가 64bit)


*CPU 사이즈에 국한된 것은 아니고 컴파일러에 따라 다르다. 

64bit CPU에서 32bit로 컴파일 시 -> 포인터 사이즈 4byte

64bit CPU에서 64bit로 컴파일 시 -> 포인터 사이즈 8byte



말그래도 자료형이 정해지지 않은 상태.


값을 가져올 수도 없고(역참조), 사이즈도 정해진 바가 없다. 


크기가 정해지지 않았기 때문에 사용하는 것을 추천하지 않는다. (메모리 할당이 많아질 수 있으므로)

+ Recent posts