배열을 처리하는 함수 (1)

2023. 1. 26. 15:03·C 언어/[책 정리] 혼자 공부하는 C언어

배열을 입출력하는 함수

  • 배열명을 꼭 포인터에 넣는 방식으로 배열을 처리할 필요가 없다
  • 하지만 함수로 배열을 처리하려면 포인터가 필요하다
  • ary 배열에서 배열명 ary는 첫 번째 배열 요소의 주소이다
  • 이 주소 값을 함수의 인수로 주면, 함수는 이 값을 받아 주소 계산을 통해 모든 배열 요소를 사용할 수 있다
  • 이때 배열명을 받을 함수의 매개변수 자리에 포인터가 필요하다

배열의 값을 출력하는 함수

==> 배열을 처리하는 함수에 필요한 것은 배열의 주소이다

 

 

배열을 처리하는 함수

#include <stdio.h>

void print_ary(int* pa); // 함수 선언

int main(void)
{
	int ary[5] = { 10, 20, 30, 40, 50 };

	print_ary(ary); // 배열명을 주고 함수 호출 
    
	return 0;
}

void print_ary(int* pa) // 매개변수로 포인터 선언
{
	int i;
	
	for (i = 0; i < 5; i++)
	{
		printf("%d ", pa[i]); // pa로 배열 요소 표현식 사용
	}
}

 

표현방법

 

print_ary 함수에서 배열명 ary를 직접 사용할 수 없을까?

 

함수 안에 선언된 변수나 배열의 이름은 사용 범위가 중괄호 블록({})으로 제한되므로 함수 안에서만 사용할 수 있다.

따라서 print_ary 함수에서는 main 함수에 있는 배열명 ary를 직접 사용할 수 없다.

이런 제한 때문에 2개 이상의 함수에서 같은 이름의 변수나 배열을 독립적으로 사용할 수 있다. 각 함수 안에 사용한 변수나 배열의 이름은 사용 범위가 다르므로 다른 함수에 있는 같은 이름의 변수나 배열과 서로 충돌하지 않는다.


배열 요소의 개수가 다른 배열도 출력하는 함수

배열의 값을 출력하는 함수는 첫 번째 배열 요소의 주소만 알면 되므로 배열 요소의 개수가 달라도 함수의 구현 방법은 같다. 다만 배열 요소의 개수가 바뀌면 출력문의 반복 횟수가 달라지므로 함수의 수정이 불가피하다

#include <iostream>

void print_ary(int* pa, int size); // 함수 선언, 매개변수 2개

int main(void)
{
	int ary1[5] = { 10,20,30,40,50 }; // 배열 요소의 개수가 5개인 배열
	int ary2[7] = { 10,20,30,40,50,60,70 }; // 요소의 개수가 7개인 배열

	print_ary(ary1, 5); // ary1 배열 출력, 배열 요소의 개수 전달
	printf("\n");
	print_ary(ary2, 7); // ary2 배열 출력, 배열 요소의 개수 전달

	return 0;
}

void print_ary(int* pa, int size) // 배열명과 배열 요소의 개수를 받는 매개변수 선언
{
	int i;

	for (i = 0; i < size; i++) // size의 값에 따라 반복 회수 결정
	{
		printf("%d ", pa[i]);
	}
}

 

Q. print_ary 함수 안에서 sizeof 연산자로 배열의 크기를 알 수 있을까?

 

A. 불가능하다. sizeof 연산자를 배열명에 사용하면 배열 전체 크기를 구하지만 포인터에 사용하면 포인터 자체의 크기만을 계산한다. 포인터가 배열명을 저장한 경우라도 마찬가지다. 따라서 다음과 같은 연산은 배열 요소의 개수를 알 수 없으므로 무의미하다.

sizeof(pa) / sizeof(pa[0]) => 포인터의 크기 / 첫 번째 배열 요소의 크기 => 4 / 4

배열에 값을 입력하는 함수

배열에 값을 입력하는 함수도 배열의 값을 출력하는 함수와 구현 방법은 같다.

다만 입력 함수는 데이터를 저장할 배열의 위치가 필요하므로 함수 안에서 포인터를 직접 사용한다

#include <iostream>

void input_ary(double* pa, int size);
double find_max(double* pa, int size);

int main(void)
{
	double ary[5];
	double max;
	int size = sizeof(ary) / sizeof(ary[0]);

	input_ary(ary, size); // 배열에 값 입력
	max = find_max(ary, size); // 배열에 최댓값 반환
	printf("배열의 최댓값 : %lf\n", max);

	return 0;
}

void input_ary(double* pa, int size) // double 포인터를 매개변수로 선언
{
	int i;

	printf("%d개의 실수값 입력 : ", size);
	for (i = 0; i < size; i++) // size의 값에 따라 반복 횟수 결정
	{
		scanf("%lf", pa + i); // &pa[i]도 가능, 입력할 배열 요소의 주소를 전달
	}
}

double find_max(double* pa, int size)
{
	double max;
	int i;

	max = pa[0]; // 첫 번째 배열 요소의 값을 최댓값으로 설정
	for (i = 0; i < size; i++) // 두 번째 배열 요소부터 max와 비교
	{
		if (pa[i] > max) max = pa[i]; // 새로운 배열 요소의 값이 max보다 크면 대입
	}

	return max; // 최댓값 반환
}

 

함수의 매개변수 자리에 배열을 선언하는 경우

 

함수의 매개변수 자리에 배열을 선언하면 배열의 저장 공간이 할당되지 않으며, 배열명은 컴파일 과정에서 첫 번째 배열 요소를 가리키는 포인터로 바뀐다

 

 

저작자표시 (새창열림)

'C 언어 > [책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글

이중 포인터와 배열 포인터  (0) 2023.04.25
배열을 처리하는 함수 (2)  (0) 2023.01.26
배열과 포인터의 관계 (2)  (0) 2023.01.26
배열과 포인터의 관계 (1)  (0) 2023.01.26
전처리 지사자 (2)  (0) 2023.01.11
'C 언어/[책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글
  • 이중 포인터와 배열 포인터
  • 배열을 처리하는 함수 (2)
  • 배열과 포인터의 관계 (2)
  • 배열과 포인터의 관계 (1)
smile blog
smile blog
건국대 첨단바이오공학부 & 컴퓨터공학부 BT & IT 기술로 희망을 꿈 꿉니당
  • smile blog
    스마일 블로그
    smile blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (837)
      • 일상 생각들 (4)
        • 일상 (4)
      • 학과에 대해 (4)
        • 첨단바이오공학부 (4)
        • 컴퓨터공학부 (0)
      • -------- 프로젝트 -------- (0)
      • [DS] 토이 프로젝트 (1)
      • [Web, Game, XR] 토이 프로젝트 (11)
      • 경진대회 (1)
      • -------- 진로 -------- (0)
      • 생물정보학자 (19)
        • 데이터 과학이란? (0)
        • 되는 방법 (9)
        • 책 추천 (2)
        • 인강 (1)
        • 대학 (2)
        • 회사 (1)
        • 학원 (2)
        • 학회 (2)
      • 디지털 헬스케어 (72)
        • 방법 (8)
        • 생각들 (10)
        • 공부법 (4)
        • 책 추천 (2)
        • 학원 (2)
        • 참고 (2)
        • 대학 (3)
        • 회사 (3)
        • 인강 (2)
        • 게임 엔진들 (1)
        • 게임 프로그래머 개론 (2)
        • 게임 프로그래머 취업 전략 가이드 (7)
        • 취업 서류 (1)
        • 애정하는 게임들 (4)
        • XR 테크니컬 아티스트 (9)
        • 영화, 애니메이션 테크니컬 디렉터 (12)
      • -------- 기초 학문 -------- (0)
      • 생명과학 이야기 (2)
        • 대학 강의 (2)
      • 화학 이야기 (0)
      • 컴퓨터과학 이야기 (0)
      • 통계학 이야기 (0)
      • 수학 이야기 (1)
        • 공학 수학 (1)
      • 영어 이야기 (1)
      • 심리학 이야기 (7)
        • 현대인과 정신건강 (7)
      • -------- 컴퓨터 언어 -------- (0)
      • Python (3)
        • 나도코딩의 파이썬 입문 (1)
        • 파이썬 관련 정보 (1)
      • SQL (0)
      • C 언어 (32)
        • 혼자 공부하는 C언어 요약 (1)
        • [책 정리] 혼자 공부하는 C언어 (31)
      • C++ (33)
        • 명품 C++ 프로그래밍 요약 (1)
        • [책 정리] 명품 C++ 프로그래밍 (27)
        • C++ STL (0)
        • 뇌를 자극하는 C++ STL (5)
      • -------- 생명과학 -------- (0)
      • 생화학 (8)
        • 대학 강의 (8)
      • 분자세포생물학 (6)
        • 대학 강의 (6)
      • 유전자치료공학 (4)
        • 대학 강의 (4)
      • 생명정보학 (7)
        • 대학 강의 (7)
      • 약리학 (2)
        • 대학 강의 (2)
      • -------- 컴퓨터과학 -------- (0)
      • 자료구조와 알고리즘 (8)
        • 자료구조와 알고리즘의 정의 (3)
        • [책 정리] C언어로 쉽게 풀어쓴 자료구조 요약 (1)
        • [인강] 자료구조와 알고리즘 (2)
        • 코딩 테스트 대비하기! (1)
      • 컴퓨터 회로 (0)
      • 컴퓨터 구조 (43)
        • 컴퓨터 구조와 운영체제 요약 (1)
        • ---------------------------------------- (0)
        • [전공 책 정리] 컴퓨터 구조 및 설계 (1)
        • Ch1. 컴퓨터 추상화 및 관련 기술 (8)
        • Ch2. 명령어 : 컴퓨터 언어 (11)
        • Ch3. 컴퓨터 연산 (8)
        • Ch4. 프로세서 (11)
        • Ch5. 메모리 계층구조 (3)
        • Ch6. 병렬 프로세서 : 클라이언트에서 클라우드까지 (0)
      • 시스템 프로그래밍 (15)
        • [책 정리] 시스템 프로그래밍 유닉스 & 리눅스 (0)
        • [인강] 리눅스 시스템 프로그래밍 (2)
        • 리눅스에서 코딩이란? (8)
        • 대학교 강의 정리 (5)
      • 운영체제 (0)
      • 컴퓨터 네트워크 (37)
        • 모두의 네트워크 요약 (1)
        • [책 정리] 모두의 네트워크 (10)
        • ---------------------------------------- (0)
        • [전공 책 정리] 컴퓨터 네트워킹 하향식 접근 8판 (1)
        • Ch1. 컴퓨터 네트워크와 인터넷 (7)
        • Ch2. 애플리케이션 계층 (7)
        • Ch3. 트랜스포트 계층 (8)
        • Ch4. 네트워크 계층 : 데이터 평면 (3)
        • Ch5. 네트워크 계층 : 제어 평면 (0)
        • Ch6. 링크 계층과 근거리 네트워크 (0)
        • Ch7. 무선 및 이동 네트워크 (0)
        • Ch8. 컴퓨터 네트워크 보안 (0)
      • 데이터베이스 (1)
      • -------- 데이터과학 -------- (0)
      • 데이터 사이언스 (8)
        • 인강 (8)
      • 데이터 분석 (2)
        • 인강 (2)
      • 머신러닝 (2)
        • 대학 수업 (2)
      • 인공지능 (11)
        • 대학교 강의 정리 (10)
        • 인공지능 관련 정보 (1)
      • -------- +a -------- (0)
      • Visual Studio Community (7)
        • 설치법 (1)
        • 단축키 (1)
        • 오류 (5)
      • Visual Studio Code (0)
      • 노션 (1)
      • 깃허브 (7)
        • 깃허브 사용법 (5)
        • 유니티, 언리얼 & 깃허브 (1)
        • 깃허브 주의사항 (1)
      • 챗GPT 활용법 (0)
      • 기타 feat. 프로그래밍 (7)
        • 프로그래머로 살아남기 (5)
        • 코딩 vs 프로그래밍 (1)
        • 애플 비전 프로 (1)
      • 메타버스 (5)
      • -------- 예술 -------- (0)
      • 음악 (1)
      • 미술 (0)
      • -------- XR -------- (0)
      • 유니티 이야기 (23)
        • 레트로의 유니티 게임 프로그래밍 에센스 요약 (4)
        • 유니티 관련 정보 (1)
        • 유니티 디버깅 (13)
        • 유니티 인강 (3)
        • 대학교 게임 프로그래밍 강의 (2)
      • 언리얼 이야기 (0)
        • 인생 언리얼 교과서 요약 (0)
      • 컴퓨터 그래픽스 (6)
        • OpenGL (6)
      • 가상현실 & 증강현실 (4)
        • 유니티 vr (4)
      • HCI 와 UI UX (7)
        • [책 정리] HCI 개론 (6)
      • -------- Design -------- (0)
      • 캐릭터 (1)
        • 모델링 (0)
        • 리깅 (1)
      • 포토샵 (3)
      • 3ds Max (7)
      • Maya (9)
        • 블로그 (1)
        • 인강 (6)
        • 대학교 (2)
      • Blender (14)
        • 책 (1)
        • 인강 (7)
        • 기타 (3)
        • 대학교 (3)
      • 아트 작업물들 (2)
      • 에셋 사이트 (1)
      • -------- 건강관리 -------- (0)
      • 건강관리 ft. 정현 (12)
        • 목 디스크 (2)
        • 눈 관리 (2)
        • 일상생활 습관 (6)
        • 일상생활 꿀팁 (2)
        • 사무직 꿀팁 (0)
      • 헬스의 정석 ft. 정현 (28)
        • 헬스와 건강 (8)
        • 헬스 구체화 정보 (6)
        • 헬스 유튜버 (1)
        • 헬스 서적 (1)
        • 도전 바디프로필! (11)
        • 헬스장 패션 (1)
      • -------- etc -------- (0)
      • 진로 관련 잡다한 글들 (34)
        • 진도율 (9)
        • 진로 관련 글들 (15)
        • 학교 강의 관련 글들 (10)
      • 인생 꿀 Tip (23)
        • 컴퓨터 초기 설정 (9)
        • 원격 데스크톱 (1)
        • 노트북 발열 (1)
        • 전자기기 (2)
        • 중고기기 팔기 (1)
        • 아이패드 필기 어플 (1)
        • 에어팟 (1)
        • 커피 (1)
        • 맥북 (1)
        • lg 그램 (1)
        • 검색엔진에서 내 티스토리 검색 (1)
        • hELLO 다크 모드 없애기 (1)
        • 인터넷 연결 문제 (1)
        • 키보드 문제 해결 (1)
      • 유튜브 (3)
      • 청춘 그리고 추억 (1)
      • 인생 계획표 (2)
        • 2024년 2학기 (1)
        • 2024년 여름방학 (0)
        • 2024년 1학기 (0)
        • 2023년 겨울방학 (1)
      • 다양한 글들 (98)
        • C++ STL (6)
        • Win32 API (24)
        • PushPush 게임 (13)
        • 컴퓨터구조 (1)
        • 자료구조와 알고리즘 (50)
        • 게임의 정의 (3)
        • 영상 회사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Dream
    • 코딩을 시작한 이유
    • 나를 소개합니다!
    • 블로그 공부법
    • IT & 가치 있는 일들
  • 인기 글

  • 태그

    컴퓨터 네트워크
    의생명공학과
    의생명정보알고리즘
    데이터과학
    생명과학
    건국대
    연산자
    인공지능
    C++
    첨단바이오공학부
    unity
    블렌더
    C언어
    유니티
    심리학
    생명공학
    코딩
    생물정보학
    배열
    스택
    함수
    데이터사이언스
    포인터
    AI
    리눅스
    알고리즘
    의생명공학
    자료구조
    명령어
    컴퓨터구조
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
smile blog
배열을 처리하는 함수 (1)
상단으로

티스토리툴바