프로그래밍 언어 활용 - 2

포인터

변수의 주소를 포인터라고 하며, 포인터를 저장할 수 있는 변수를 포인터 변수라고 한다.

  • C 문제
#include <stdio.h>
main()
{
	int a = 50;
    int *b = &a;
    *b = *b + 20;
    printf("%d, %d\n", a, *b);
    char *s;
    s = "ksw";
    for (int i = 0; i < 3; i += 2)
    {
    	printf("%c, ", s[i]);
        pritnf("%c, ", *(s + i));
        printf("%s\n", s + i);
    }
}
  • 풀이 및 답
  1. *b = &a 이므로 b가 가리는 주소는 a이며, a의 값은 50이다.
  2. b = b + 20 = &a + 20 = 50 + 20 = 70
  3. 따라서 a와 *b는 각각 70, 70이다.
  4. s = ksw
  5. ksw는 각각 &s[0], &s[1], &s[2]
  6. 따라서 s[i]는 s[0]의 값을 문자로 출략 후 쉼표와 공백 한 칸 출력
  7. printf("%c, ", s[i])는 k,
  8. *(s + i)는 (s + 0)이 가리키는 곳의 값을 문자로 출력 후 쉼표와 공백 한 칸 출력
  9. printf("%c, ", *(s + i))는 k, k,
  10. (s + i)는 (s + 0)의 위치부터 문자열의 끝까지 모든 문자를 하나의 문자열로 출력 후 커서를 다음줄의 처음으로 옮긴다.
  11. 최종적으로 출력되는 값은 다음과 같다.

    70, 70
    k, k, ksw

구조체

  • 개요
    자료의 종류가 다른 변수의 모임
  • 정의
    정의한다는 의미는 int나 char같은 자료형을 하나 만드는 것을 의미함
  • 변수 선언
    int a와 같이 선언 후 사용하는 것처럼 구조체 변수를 사용하려면 먼저 정의한 구조체에 대한 변수를 선언해야한다.
  • 멤버의 지정
    구조체의 멤버는 모든 요소들이 개별적인 이름을 가지고 있으므로 구조체
    • '.'에 의한 지정 : 구조체 일번 변수를 이용해 구조체 멤버를 지정할 때
    • '->'에 의한 지정 : 구조체 포인터 변수를 이용해 구조체 멤버를 지정
    • 구조체의 포인터 변수는 일반 포인터 변수처럼 *를 사용하여 멤버를 지정할 수 있음
  • C 문제
#include <stdio.h>
struct jsu
{
	char nae [12];
    int os, db, hap, hhap;
};
int main()
{
	struct jsu st[3] = {{"data1", 95, 88}, {"data2", 84, 90}, {"data3", 85, 75}};
    struct jsp* p;
    p = &st[0];
    (p + 1)->hap = (p + 1)->os + (p + 2)->db;
    (p + 1)->hhap = (p + 1)->hap + p->os + p->db;
    printf("%d", (p + 1)->hap + (p + 1)->hhap);
}
  • 해설 및 답
  1. 구조체 jsu 자료형으로 3개짜리 배열 st를 선언 후 초기화
  2. 구조체 jsu의 포인터 변수 p를 선언
  3. p에 st배열의 첫 번째 요소의 주소를 저장
  4. p+1이 가리키는 곳의 멤버 hap에 p+1이 가리크는 곳의 멤버 os값과 p+2가 가리키는 곳의 멤버 db값을 합한 후 저장
  5. p가 st[0], p+1은 st[1], p+2는 st[2]를 각각의 값으로 더한 159를 st[1]에 저장
  6. p+1이 가리키는 hhap에 p+1이 가리키는 hap의 값과 p가 가리키는 os와 db값을 모두 더한 후 저장
  7. 각각의 값을 모두 저장한 342를 st[1] hhap에 저장
  8. p+1이 가리키는 hap과 hhap의 값을 더한 후 정수로 출력
  9. 따라서 159 + 342더한 값을 출력

    501

사용자 정의 함수

  • 개요
    사용자가 직접 만들어 사용하는 함수
  • C 문제
    재귀 함수를 이용해 팩토리얼 연산을 수행하는 프로그램의 실행 결과 확인
#include <stdio.h>
int factorial(int n);

main()
{
	int (*pf)(int);
    pf = factorial;
    printf("%d", pf(3));
}

int factorial(int n)
{
	if (n <= 1)
    	return 1;
    else
    	return n * factorial(n - 1);
}
  • 해설 및 답
  1. 정수형 인수 한 개를 받는 정수형 함수 포인터 pf 선언
  2. factorial()의 시작 주소를 포인터 pf에 저장
  3. 3을 인수로 하여 pf()함수를 호출해 돌려받은 값을 정수형으로 출력
  4. factorial()이 3을 전달 받았으므로 n = 3
  5. if()의 조건에 따라 n * factorial(n - 1) 수행
  6. factorial(n - 1) = 2이므로 factorial(2)인 상태로 호출
  7. 따라서 n = 2d이며, if()의 조건에 따라 factorial(1)인 상태로 호출
  8. 7번 결과에 따라 n = 1이고 if()문의 조건에 따라 1을 반환
  9. 1을 반환했으므로 2를 반환하며 제어를 factorial(2)를 호출했던 단계로 재귀
  10. 2를 반환했으므로 6을 반환하며 제어를 factorial(3)를 호출했던 단계로 재귀
  11. 6을 반환했으므로 돌려받은 값 6을 정수형으로 출력 후 프로그램 종료

    6

좋은 웹페이지 즐겨찾기