728x90
728x90
포인터 (변수) : 메모리의 주소값을 저장하기 위한 변수

(주소값과 포인터는 다른 것)

앞으로 .. 그림으로도 그려가보면서 이해하는게 도움이 많이 될 것이다.
또한 말로 풀어서 설명해볼 수 있으면 더 좋음

 

int n = 7;
// 0x001~0x114
// 0x001부터 시작하는 메모리다..
// 주소값은 시작점만 말하면 된다

 

컴퓨터의 주소 체계에 따라 크기가 결정된다.

시장의 요구에 맞춰, 역사적으로 점진적으로 커져 왔다. 
Q. 8/16/32/64비트를 결정짓는 요소가 뭘까?
- CPU가 한 클럭 당 처리할 수 있는 사이즈

 

8비트 시스템에서는 주소값을 나타내는데 8비트를 사용한다. 메모리의 주소번지를 2의 8승만큼 만들 수 있다.
포인터는 1바이트가 되어야 한다.

64비트 시스템도 주소값을 나타내는데 32비트를 사용한다.

32/64비트 시스템은 32비트로 주소를 표현하고 (2의 32승, 4바이트)
포인트의 크기는 최소 4바이트가 되어야 한다.

32비트 시스템 기반 4바이트

32/64비트 시스템은 32비트로 주소를 표현하기 때문이다.

pN이라는 포인트는 n을 가리킨다

 

int *a;
// int 형 변수/상수를 가르킬 수 있는 포인터

char *b;
// char형 변수/상수를 가르킬 수 있는 포인터

double * c;
// double형 변수/상수를 가르킬 수 있는 포인터


// 아래는 다 같은 표현이다
int* a;
int * a; //지양
int *a;

 

A형 포인터 (A*): A형 변수의 주소값을 저장

 

주소 관련 연산자

& 연산자 : 변수의 주소 값 반환
* 연산자 : 포인터가 가리키는 메모리 참조
-- * 연산자는 포인터선언, 포인터가 가리키는 메모리에 접근, 곱셈 등 다양한데 사용

어떠한 용도로 사용됐는지는 피연산자를 보고 알 수 있다.

a*b   // 곱셈
int * p;   // 포인터선언
*p; //포인터가 가리키는 메모리에 접근

 

예시

int a = 2005;
int *pA = &a; // Ox30 등이 들어간다
// pA가 a를 가르키게 된다.

print("%d", a); // 직접접근
print("%d", *pA); // 간접접근
// pA라는 포인터가 가리키는 변수 a를 참조, 2005가 출력
// 포인터가 가르키는 메모리공간을 참조

print("%d", pA); // a의 주소, Ox30
#include <stdio.h>

int main()
{
    int a = 2005;
    int* pA = &a;  //pA 변수가 a변수를 가리킨다.
    
    printf("pA: %d \n", pA); //주소값이 10진수 정수형으로 출력
    printf("&a: %d \n", &a); 
    
    (*pA)++;
    
    printf("a: %d \n", a); 
    printf("*pA: %d \n", *pA); 

    return 0;
}

 

 

 포인터에 다양한 타입이 존재하는 이유?
- 포인터타입은 참조할 메모리의 크기 정보를 제공

int* a;
char* c;
// 포인터는 둘 다 32비트..4바이트로 메모리의 주소값 저장

 

왜 포인터에 타입을 두는 걸까?
- 포인터 타입에 따라 몇 바이트를 읽어들일지 차이가 난다.

#include <stdio.h>

int main()
{
    int a = 10;
    int* pA = &a; 
    double e= 3.14;
    double* pE= &e;
    
    printf("%d %f", *pA, *pE); 

    return 0;
}

 

주소값은 포인터다? x
- 포인터는 주소값 외에도... 타입(자료형정보), 가리키는 대상, 등을 갖고 있다

포인터 = 주소값 + 자료형.

 

잘못된 포인터 사용 사례

#include <stdio.h>

// 초기화 안한 사례
int main()
{     
    int* pA; // 어딘가를 가르키는 중 (쓰레기값 들어있)
	
    *pA = 10; // 운영체제에 의해 문장이 중지되고 경고메세지 나옴
	// 컴파일은 됨

    return 0;
}
#include <stdio.h>

int main()
{
     
    int* pA = 100; //100이 어딘 줄 알고
    *pA = 10; // 운영체제가 허용하지 않는다

    return 0;
}

 

연습문제

int형 변수 num1과 num2를 선언과 동시에 각각 10과 20으로 초기화하고,
int형 포인터 변수 ptr1과 ptr2를 선언하여 각각 num1과 num2를 가리키게하자.

그리고 이상태에서 포인터 변수ptr1과 ptr2를 이용해서 num1의 값을 10 증가시키고 num2의 값을 10 감소시키고
이제 두포인터 변수 ptr1과ptr2가 가리키는 대상을 서로 바꾸자. 즉, 포인터 변수 ptr1이 num2를 가리키게하고, 포인터 변수 ptr2가 num1을 가리키게 하자.

그리고 마지막으로 ptr1과 ptr2가 가리키는 변수에 저장된 값을 출력하자.

 

#include <stdio.h>

int main()
{
    int num1 = 10;
    int num2 = 20;
    int *ptr1 = &num1;
    int *ptr2 = &num2;
    int *temp;
    
    // 값 변화
    *ptr1 += 10;
    *ptr2 -= 10;
    
    // ptr1, ptr2가 가리키는 변수에 저장된 값 출력
    printf("1- *ptr1 : %d\n", *ptr1);
    printf("1- *ptr2 : %d\n", *ptr2);
    
    // 가리키는 대상 변화
    temp = ptr1;
    ptr1 = ptr2;
    ptr2 = temp;

    
    // ptr1, ptr2가 가리키는 변수에 저장된 값 출력
    printf("*ptr1 : %d\n", *ptr1);
    printf("*ptr2 : %d\n", *ptr2);
   
    return 0;
}

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v