본문 바로가기

Algorithm/C프로그래밍

[2주차] 포인터(3), (4)

반응형

#9.3 배열과 포인터

배열 이름의 비밀

  • 배열 이름 == 배열의 0번 원소의 시작 주소를 의미
  • 따라서 정수형 배열의 자료형은 int *
    • &ar은 전체 배열의 시작 주소
    • ar과 값은 같지만 다른 자료형(13장)

주소를 이용한 배열 참조

  • 배열 이름은 주소를 의미 -> 참조 연산자와 사용 가능

배열을 포인터 변수에 연결하여 사용하기

  • 포인터 변수에 대한 증감 연산 -> 포인터 변수가 나타내는 자료형의 크기 단위로 증감
  • 포인터 변수도 배열의 첨자 형태로 값 참조 가능

배열과 포인터 주의사항

  • 포인터를 배열의 중간 원소에 연결시키는 것도 가능 -> 포인터는 단지 자신이 가리키는 주소를 기준으로 배열 쓸 수 있음
  • 포인터 참조 연산자 사용 시 괄호 유의(연산자 우선순위)
  • 포인터 변수의 증감량은 가리키는 배열의 원소 크기가 아니라, 포인터 자신의 자료형에 의해 결정

 

#9.4 포인터 연산

주소에 정수를 더하거나 빼기

  •  ++, --, +=, -= 모두 가능
    • but 배열은 바꿀 수 있는 주소가 X(++arr 이런 건 안 됨)

주소 비교하기

  • 비교 연산자 ==, !=, <, >, >=, <= 사용 가능

#9.5 포인터 인자와 주소 반환(1)

함수 수행 과정 - 정수 인자

  1. 함수 시작(호출): 형식 인자(변수)에 공간이 할당되고, 각 인자에 전달된 정수 값이 대입됨.
  2. 함수 본체 수행: 지역변수 i에 10 대입
  3. 함수 종료: 함수의 지역변수(인자 포함)가 없어짐 (할당된 메모리 공간 반환, 해제)
void main() {
	int a = 5;
    change(a);
    printf("a=%d\n",a);
}

void chang(int i)
{
	i = 10;
}

 

함수 인자가 정수가 아니라 주소라면?

  • 주소를 저장하기 위해 함수의 형식 인수는 포인터로 선언
  • 포인터 변수를 이용한 간접 참조
  1. 함수 시작(호출): 형식 인자(변수)에 공간이 할당되고, 각 인자에 전달된 주소가 대입됨.
  2. 함수 본체 수행: p가 가리키는 변수에 10 대입
  3. 함수 종료: 함수의 지역변수(인자 포함)가 없어짐 (할당된 메모리 공간 반환)
void main() 
{	
	int a = 5;
	change(&a);
    printf("a=%d\n",a);
}
void change(int *p)
{
	*p = 10;
}

 

함수 인자 비교 🌟

값에 의한 호출(call-by-value)

  • 정수 값이나 문자 등을 인자로 함수를 호출하는 것
  • 호출하는 함수의 변수에 영향을 못 미침
  • 지역성/독립성

주소에 의한 호출(call-by-reference)

  • 주소를 인자로 함수를 호출하는 것
  • 간접 참조로 인해 호출하는 함수의 변수 값을 변경시킬 수 있음

두 호출 방식의 함수의 수행 과정(인자 전달 및 제어 흐름)은 완전히 동일하다. 값이 전달되느냐, 주소가 전달되느냐에 따라오는 부수적인 효과일 뿐이다.

반응형

'Algorithm > C프로그래밍' 카테고리의 다른 글

[5주차] 문자열  (0) 2021.09.29
[4주차] 문자열  (0) 2021.09.27
[1주차] 2. 포인터(2)  (0) 2021.09.13
[1주차] 1. Orientation + 포인터(1)  (0) 2021.08.31
[C언어] 2차원 배열(3): 2차원 배열을 포인터에 넣기  (2) 2021.07.03