거북이와 개구리의 끄적끄적

6일차_C언어(포인터의 const키워드와 주소연산과 캐스팅과 addressing, 표준입력함수, 배열과 포인터) 본문

공부/팁스

6일차_C언어(포인터의 const키워드와 주소연산과 캐스팅과 addressing, 표준입력함수, 배열과 포인터)

거북이가개굴개굴 2018. 7. 19. 01:52

6일차_C언어

이 글은 Tips 6일차 강의를 듣고 정리한 내용입니다.

잘못된 내용, 보충할 내용, 궁금한 내용 있으시다면 댓글 달아주시면 감사하겠습니다.


오늘의 목차는 아래와 같습니다.

-포인터의 const 키워드

-포인터와 주소연산

-포인터의 캐스팅 // 활용1.일부분만사용

-포인터의 addressing

-표준 입력 함수

-배열과 포인터



1.포인터의 const 키워드

포인터 변수에서는 const키워드를 3가지 방법으로 사용 가능.

변경하고 싶지 않은 놈의 앞에 두면 됨.

<const 자료형 *변수명>

*변수명의 값을 변경하지 않겠다.

<자료형* const 변수명>

변수명의 값을 변경하지 않겠다.

<const 자료형* const 변수명>

*변수명의 값과 변수명의 값 둘 다 변경하지 않겠다.

<Swap함수에 적용하기>

void Swap(int *pa, int *pb)에서 pa와 pb의 주소변경을 막으려면?
void Swap(int* const pa, int* const pb)로 수정하면 됨.


2.포인터와 주소연산

포인터는 어떤 대상을 가르키는 것이므로 포인터에 대한 연산은 일반적인 산술연산과는 결과가 다르다.

포인터(주소)에 대한 연산은 가르키는 대상의 자료형 크기만큼 연산 됨.

이를 주소연산이라 함.

int a = 10; a++; // a는 11

int* a = (int*)10; a++; // a는 14


<주소연산의 경우의 수>

주소연산은 연산자는 +,- 피연산자는 주소,상수로 총 4가지의 경우의 수가 생깁니다.

<표> 



3.포인터의 캐스팅

int* data = &변수;

char* p = (char*)data; 처럼 캐스팅으 해서 쓰는 경우가 있습니다.

왜 쓰는걸까요?

<데이터의 일부에 접근하는 방법>

데이터의 일부에 접근하는 방법이라 함은 어디선가 봤던 내용인 것 같습니다.
c언어에서는 바이트단위의 자료형만 존재합니다. 
1바이트의 일부인 비트에 접근하기 위해서는 비트연산자와 시프트 연산자를 사용했었습니다.
마찬가지로 4바이트를 가르키는 int*가 있지만 그 중 일부에 접근하고 싶을 때 캐스팅을 사용할 수 있습니다.
4바이트 중 1바이트씩 접근하고 싶은 경우 char*로 캐스팅하면 됩니다.
4바이트 중 2바이트씩 접근하고 싶은 경우 short*로 캐스팅 하면 됩니다.

<방법 별 특성>

편한 정도        성능
포인터캐스팅                    편함            다소 떨어짐
비트연산자시프트연산자      불편            좋음


4.포인터의 addressing

포인터의 addressing에는 2가지 방법이 있음

<Displacement addressing>

포인터 변수의 주소값을 대체(displacement) 하는 방법.

int* p = 주소; p++ 이런거

<Indexing addressing>

배열에서 인덱스를 사용했던 것처럼 똑같은 거.

int* p = 주소; *(p+0); *(p+1); 이런 거.

<뭐가 더 효율적일까?>

displacement addressing이 더 효율적이긴하나 요즘엔 최적화가 잘 되어있어서 비슷하다.



5.표준 입력 

도입내용

<getchar, getc, gets>

시프트연산자 내용

<scanf>

비트 연산자 내용

<fflush()와 rewind()>

이게 왜 쓰는지

<void와 void*>

void

<표준입력함수들의 반환값>

함수들별 반환값.
새로운 함수 쓸때는 반환값 읽어보고 예외처리.


6.배열과 포인터

<배열표기와 포인터표기의 호환>

배열 <-> 포인터
배열의 시작주소는 배열의 이름

<포인터로 선언하고 배열처럼 쓰는 경우>

수식의 깔끔 단순

<배열로 선언하고 포인터처럼 쓰는 경우>

배열의 하나의 요소의 일부 바이트에 접근.

<배열기준으로 포인터 선언하기>

int *p[10];

<포인터기준으로 배열 선언하기>

int (*p)[10];



읽어주셔서 감사하고 강의 정리가 너무 늦어져서 죄송합니다.