포인터, 배열, 그리고 포인터 연산

바둑이·2022년 4월 11일
0

안녕하세요. 이번 시간에는 C언어 에서 포인터, 배열, 그리고 포인터 연산에 대하여 간단하게 정리해 보려고 합니다.부족한 부분이 있다면 알려주시면 감사하겠습니다.

  • 메모리

    	컴퓨터의 메모리는 데이터를 보관하는 장소
    
    	바이트(8 bits)단위로 주소가 지정됨
    
    	모든 변수는 주소를 가짐
  • 포인터

    	메모리 주소를 값으로 가지는 변수이다. 포인터 변수는
    	다음과 같이 선언된다.
    
    	type-name * variable-name;
    
    	variable-name은 선언됨 포인터 변수의 이름이며, * 는 variable-name
    	이 포인터 변수임을 표시하고, type-name은 포인터 변수 variable-name
    	에 저장될 주소에 저장될 데이터의 유형을 지정
    
    	int * ptr;
    
    	연산자 &는 변수로부터 그 변수의 주소를 추출하는 연산자이다.
    
    	int c = 12;
    	int *p;
    	p = &c; //포인터 변수 p에 변수 C의 주소를 저장한다.
    
    	int x = 1, y = 2;
    	int * ip;
    	ip = &x;
    
    	// x = 1, y = 2, ip = 1028
    
    	y = *ip;
    
    	// x = 1, y = 1, ip = 1028
    
    	*ip = 0;
    
    	// x = 0, y = 2, ip = 1028
    
    	포인터와 배열은 매우 긴밀히 연관되어 있다.
    	예를 들어 다음과 같이 선언된 배열 a가 있다고 하자.
    
    	int a[10]; // 10개의 정수를 수용할 수 있는
    			   // 메모리 (40바이트)가 할당됨
    
    	//배열의 이름은 배열의 시작 주소를 저장하는 포인터 변수임
    	//(단 그 값을 변경할 수 없음)
  • 포인터 arithmetic

    	*a와 a[0]은 동일한 의미이다.
    	또한 a[1]은 *(a+1)과 동일하고, a[i]는 *(a+i)와 동일하다.

int a[10];
*(a+i) // 이러한 연산을 포인터 arithmetic이라고 부른다.

  • 동적 메모리 할당

    	변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 이것을
    	동적 메모리 할당(dynamic memory allocation)이라고 부른다.
    
    	malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를
    	할당하고 그 시작 주소를 반환한다.
  • malloc 함수

    	int * p;
    	p = (int * )malloc(40); //malloc이 반환하는 주소는 타입이 없는 주소(void *)이다. 정수들을 저장하기 위해서 이것을 int *로 변환한다. 
    							//반드시 필요한 건 아니다. 
    							// 할당받을 메모리의 크기를 byte단위로 지정한다. 여기서는 10개의 정수를 저장하기 
    							//위해서 40바이트를 요청하였다.
    	if (p == NULL){
    		/* 동적 메모리 할당이 실패 */
    		/* 적절한 조치를 취한다. */
    	}						
    
    	p[0] = 12; //malloc으로 할당받은 메모리는 이렇게 보통의 배열처럼 사용한다.
    	p[1] = 24;
    	*(p+2) = 36;
    	...
  • 배열 키우기

    	동적으로 할당된 배열은 공간이 부족할 경우 더 큰 배열을 할당하여 사용할 수 있다.
    
    	int * array = (int *)malloc(4*sizeof(int));
    
    	/* 배열 array의 크기가 부족한 상황이 발생한다. */
    
    	int * temp = (int *)malloc(8*sizeof(int));
    	int i;
    	for (i = 0; i < 4; i++)
    		tmp[i] = array[i];
    
    	array = tmp;
profile
안녕하세용('<')/

0개의 댓글