-
포인터의 표기법
* 을 이용 ( *의 개수가 차원의 차수를 의미)
_____좌_______= ______우_______
대입연산자의 경우 좌 우의 차원이 동일해야 오류가 나지 않음!
*이 붇으면 차원이 하나 올라감 1차원!
1. 선언하는 경우 (오른쪽에 붙여줌) : 차원을 높여줌
예) int a = 2; (둘 다 0 차원임)
int* ap= &a; (둘 다 1차원임-- 주소값을 의미함)
2. 실행하는 경우 (왼쪽에 붙여줌) : 차원을 낮춰줌
ap라는 포인터변수의 주소값의 위치로 찾아가서 그 주소값에 있는 값을 꺼내와라라는 뜻
예) printf(" %d" , *ap);
----> 포인터 변수 ap가 가지는 주소값으로 이동하여 그 주소값이 가리키는 값을 꺼내오니까 '2' 를 출력함
차원에 대한 이해 ?
call by value -- 값에 의한 호출
---> 실제 메모리에 있는 값에 접근할 수 없음
call by reference -- 주소값에 의한 호출
---->실제 주소값으로 접근함
#include <stdio.h>
int main(){
int a = 22; // 주소는 1byte 마다 하나식 붙어 있다고 생각하자... 첫번째 칸의 주소가 시작값
int* ipt = &a; // a라는 변수에서 추출된 포인터 변수 추출할 때는 반드시 어떤 타입(int)인지 표기해야 한다.
// 값은 차원이 없지만, 주소는 1차원 주소임 (1차원 올라감)
// 모든 포인터 변수는 다 4byte 이다. (변수의 차원도 같아야 함 예- int* pt= 22; 는 차원이 맞지 않아 오류남 )
printf("%d, %d\n", ipt, &a);
printf("%d, %d\n",a, *ipt);
// 실행문에 *을 붙여주면 ipt가 가리키는 주소로 가서 그 값을 나타내라 라는 뜻(실행문에서의 *은 차원을 하나 낮춰줌)
//포인터 값의 출력
// pt가 가리키는 값을 따라가서 그 안의 값을 출력할 수 있음
char ch = 'K';
char* cpt = &ch;
printf("address: %d, %d\n", cpt, &ch);
printf("value: %c, %c\n", *cpt, ch);
#include <stdio.h>void exchange(int*, int*);// 주소가 날라오는 것이기 때문에 int로부터 추출된 주소값이라는 의미로 포인터변수로 받아야 함!void exchange(int* xp, int* yp){ // call by reference- 원본 접근printf("%d, %d\n", *xp, *yp);int temp = *xp; // 교환을 위한 임시값에 xp를 따라간 곳의 값을 넣어둠*xp = *yp; // xp를 따라간 곳의 값에 yp를 따라간 곳의 값을 대입*yp = temp; // yp를 따라간 곳에 있는 값에 temp 값을 대입}int main(){int x = 22, y = 66;printf("x=%d, y=%d\n", x,y);// 호출하기 때문에exchange(&x, &y); // call by value는 원본에 접근할 수 없음... 주소가 전달되도록 하자!printf("x=%d, y=%d\n", x,y);일반적인 교환 exchage 의 방식으로 생각하여 접근하면 x,y 값이 바뀌지 않는 것을 알 수 있음.. x, y 의 주소값이 전달되지 않기 때문에 그냥
그 순간의 값만 바뀔 뿐 x, y 변수가 가지고 있는 주소값이 가리키는 값은 변경되지 않는다..
'C, C++' 카테고리의 다른 글
포인터 얕은 복사 깊은 복사 (0) 2018.12.13 포인터와 배열 (0) 2018.12.13 함수의 선언과 사용 (2) 2018.12.12 [IEEE 754] 부동소수점과 바이어스 표현법 (0) 2018.12.12 C의 자료형의 표현[java와 비교] (0) 2018.12.12