메모리 어드레스 단위가 워드가 아닌 바이트인 이유.
'업무 > C언어 등 IT 상식' 카테고리의 다른 글
바이러스 관련 재미있는 글 (0) | 2017.12.06 |
---|---|
[표준 라이브러리 함수] stderr, stdin, stdout, fprintf fflush (0) | 2017.12.01 |
게이트웨이 vs 라우터 (0) | 2017.11.29 |
포인터 정리 (0) | 2017.11.28 |
포인터의 사이즈 (0) | 2017.11.28 |
메모리 어드레스 단위가 워드가 아닌 바이트인 이유.
바이러스 관련 재미있는 글 (0) | 2017.12.06 |
---|---|
[표준 라이브러리 함수] stderr, stdin, stdout, fprintf fflush (0) | 2017.12.01 |
게이트웨이 vs 라우터 (0) | 2017.11.29 |
포인터 정리 (0) | 2017.11.28 |
포인터의 사이즈 (0) | 2017.11.28 |
게이트웨이 vs 라우터
게이트웨이 :
현재 네트워크와 다른 네트워크를 연결하는 지점. 추상적인 개념. 고속도로의 톨게이트 개념.
패킷을 변환하는 역할. Ex)음성데이터의 음성코덱을 바꾸는 경우.
즉 두개의 컴퓨터가 네트워크 상에서 서로 연결되려면 동일한 통신 프로토콜을 사용해야함. 따라서 프로토콜이 다른 네트워크 상의 컴퓨터와 통신하려면, 두 프로토콜을 적절히 변환해 주는 변환기가 필요한데, 게이트웨이가 이러한 변환기 역할을 하는 것.
라우터 :
게이트웨이가 구현된 물리적 장치. 패킷의 최적 경로를 찾는 장비.
종류 :정적,동적 라우팅.
즉 라우터가 게이트웨이를 포함한 개념.
Ex)
컴퓨터 게이트웨이는 무엇으로 잡는가?
è 그 컴퓨터의 게이트웨이는 155.230.156.5로 잡아라.
여기 라우터 뭐 쓰나요?
è 여기 라우터xxx 쓰는데, 이 장비는 대역폭이 1Gbits나 된대.
[표준 라이브러리 함수] stderr, stdin, stdout, fprintf fflush (0) | 2017.12.01 |
---|---|
메모리 접근은 바이트 단위로 한다. (0) | 2017.11.29 |
포인터 정리 (0) | 2017.11.28 |
포인터의 사이즈 (0) | 2017.11.28 |
(void *) 형변환 (0) | 2017.11.23 |
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
출처 : 코딩도장
[표준 라이브러리 함수] stderr, stdin, stdout, fprintf fflush (0) | 2017.12.01 |
---|---|
메모리 접근은 바이트 단위로 한다. (0) | 2017.11.29 |
게이트웨이 vs 라우터 (0) | 2017.11.29 |
포인터의 사이즈 (0) | 2017.11.28 |
(void *) 형변환 (0) | 2017.11.23 |
포인터의 사이즈는 CPU 사이즈와 관계가 있다.
만약 사용하는 CPU가 64bit인 경우 포인터의 사이즈는 8byte이고
32bit인 경우 포인터의 사이즈는 4byte이다.
가상 메모리 주소가 64bit의 CPU ->한번에 전송할 수 있는 데이터 : 2^32 (4G)
(=가상주소를 취급하는 어드레스 버스의 크기가 64bit)
*CPU 사이즈에 국한된 것은 아니고 컴파일러에 따라 다르다.
64bit CPU에서 32bit로 컴파일 시 -> 포인터 사이즈 4byte
64bit CPU에서 64bit로 컴파일 시 -> 포인터 사이즈 8byte
[표준 라이브러리 함수] stderr, stdin, stdout, fprintf fflush (0) | 2017.12.01 |
---|---|
메모리 접근은 바이트 단위로 한다. (0) | 2017.11.29 |
게이트웨이 vs 라우터 (0) | 2017.11.29 |
포인터 정리 (0) | 2017.11.28 |
(void *) 형변환 (0) | 2017.11.23 |
말그래도 자료형이 정해지지 않은 상태.
값을 가져올 수도 없고(역참조), 사이즈도 정해진 바가 없다.
크기가 정해지지 않았기 때문에 사용하는 것을 추천하지 않는다. (메모리 할당이 많아질 수 있으므로)
[표준 라이브러리 함수] stderr, stdin, stdout, fprintf fflush (0) | 2017.12.01 |
---|---|
메모리 접근은 바이트 단위로 한다. (0) | 2017.11.29 |
게이트웨이 vs 라우터 (0) | 2017.11.29 |
포인터 정리 (0) | 2017.11.28 |
포인터의 사이즈 (0) | 2017.11.28 |