C언어 정리
함수 : 특정한 작업을 수행하는 독립적인 부분
- 함수 사용시 코드 중복을 막을 수 있다.
- 재사용성이 있다.
- 모듈로 나누어 개발 과정이 쉬워진다.
함수의 종류
- 사용자 정의 함수
- 라이브러리 함수 : 컴파일러 제공 라이브러리
함수 구현
반환형 함수이름(매개변수 1, ... , 매개변수 n) <- 함수 헤더
함수시작{
함수 몸체
함수 종료}
함수 호출 : 함수를 호출하여 사용하는 것
함수 원형 : 컴파일러에게 함수에 대하여 미리 알리는 것(함수 호출 부분 위에 있으면 안써도 되지만 그런 경우가 적음)
가변 매개 변수 : 매개 변수의 개수가 가변적으로 변할 수 있는 기능
ex) int sum(int sum, ...)
순환 (재귀 호출) : 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법. 자기자신을 재호출하는 것으로 순환을 멈추는 부분이 있어야 함
함수와 변수
변수의 속성 : 이름,타입,크기,값+범위,생존시간,연결
범위 : 변수가 사용 가능한 범위, 가시성
생존 시간:메모리에 존재하는 시간
연결 : 다른 영역에 있는 변수와의 연결 상태
변수의 범위
전역 변수 : 함수의 외부에서 정의. 프로그램이 끝나면 소멸. 초기화 안해도 0. 모든 함수에서 사용하는 공통적인 데이터를 전역변수로 선언. 우선순위 지역변수 > 전역변수
지역 변수 : 함수의 내부, 블록 안에서 정의. 선언된 블록이 끝나면 소멸
생존 기간
자동 할당 : 블록에 들어갈 때 생성, 블록에서 나올 소멸
정적 할당 : 프로그램 실행 시간 동안 계속 유지. 변수가 선언된 위치, 저장 유형 지정자로 생존기간 결정
auto : 자동할당과 동일
static : 정적변수로 블록이 끝나도 유지됨
register : CPU안의 레지스터에 변수가 저장됨
extern : 외부 연결시 사용
연결 : 다른 범위에 속하는 변수들을 서로 연결하는 것
외부 연결 : 전역변수에 extern을 붙여 다른 파일에서도 접근 가능하게 함
내부 연결 : 함수앞에 static 붙여 외부에서 접근 못하게 함
무연결
배열
배열 : 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 저장 장소
배열은 변수에 ‘인덱스’를 통해 접근함. 반복문과 활용하면 간편하게 처리됨. 원소 일일이 복사,비교 해야됨
ex)int grade[10]; -> 정수형 원소 10개를 저장하는 grade 배열 생성(인덱스는 0부터)
초기화 : int grade[5]={10,20,30}; -> [0]:10 [1]:20 [2]:30 [3],[4]:0 저장됨. 배열크기 지정안하면 초기화된 개수만큼만 배열 생성
배열 원소 개수 구하기 : sizeof(배열이름) / sizeof(배열이름[0])
포인터
포인터
- 변수의 주소를 가지고 있는 변수.
- 변수의 크기에 따라서 차지하는 메모리 공간이 달라진다.
- 명시적으로 포인터의 타입을 변경할 수 있음
포인터 변수 선언 : *변수 ex) int *p;
변수의 주소를 계산하는 연산자 : & ex) 변수 i의 주소 : &i
포인터와 변수의 연결 : p = &i;
간접 참조 연산자 *: 포인터가 가리키는 값을 가져오는 연산자 ex) *p -> p가 가리키는 변수의 값 반환
포인터 연산
증가 연산 : 포인터변수에 +1을 할 경우 타입에 따라 주소 늘어나는 양이 다름
ex) char 타입 +1-> 1byte 증가, int타입 +1 -> 4byte증가
*p++ : p가 가리키는 위치에서 값을 가져온 후에 p를 증가
(*p)++ : p가 가리키는 위치의 값을 가져온 후 처리가 끝나면 값을 증가
*++p : p를 증가시킨 후에 p가 가리키는 값을 가져옴
++*p : p가 가리키는 위치에서 값을 가져온 후 처리 전에 그 값을 증가
포인터와 배열
포인터는 배열처럼 사용이 가능(인덱스 표기법을 포인터로도 가능)
ex) int a[] = {10,20,30,40,50}; *a->10 *(a+1) -> 20 a->a[0]의 주소 (a+1)->a[1]의 주소
int *p=a; p[0]=10;
함수 호출시 인수 전달 방법
값에 의한 호출(call by value) : 변수를 매개변수로 사용할 때 값을 복사해서 넘겨줌
참조에 의한 호출(call by reference) : 해당 변수의 주소값을 넘겨줌(scanf도 주소값을 넘김). 배열 매개 변수는 인덱스 없이 적으면 됨
포인터 사용 주의점
- 초기화가 안된 포인터를 사용하면 안됨 ex) int *p; *p=100;
- 포인터가 아무것도 가리키고 있지 않는 경우에는 NULL로 초기화
- NULL 포인터를 가지고 간접 참조할 경우 하드웨어로 감지 가능
- 포인터의 유효성 여부 판단이 쉬움
- 포인터의 타입과 변수의 타입 일치해야함
- 함수가 종료되더라도 남아있는 변수의 주소를 반환해야함 (함수 내에 있는 지역 변수의 주소를 반환하면 함수종료시 사라져서 오류가 뜸)
포인터 사용의 장점
- 연결 리스트나 이진 트리 등의 향상된 자료 구조를 만들 수 있음
- 참조에 의한 호출이 가능함
- 동적 메모리 할당
이중 포인터
이중 포인터 : 포인터를 가리키는 포인터
**p -> *p : p가 가리키는 위치의 내용 **p : *p가 가리키는 위치의 내용
포인터 배열 : 포인터를 모아서 배열로 만든 것
int *ap[10]; -> [] 연산자가 *연산자보다 우선 순위가 높아 ap는 배열이 됨 -> int *(포인터)들의 배열로 선언
ex) int *ap[10]={&a,&b,&c,&d,&e};
2차원 배열로 문자열 저장 | 문자형 포인터 배열 |
char fruits[4][10]={“apple”,“blueberry”}; | char *fruits[]={“apple”,“blueberry”}; |
2차원 배열 사용시 낭비되는 공간 발생 | 그런거 없다 |
배열 포인터 : 배열을 가리키는 포인터
int (*pa)[10]; -> 먼저 포인터가 됨 -> int [10]을 가리키는 포인터가 됨
ex) int a[5]={1,2,3,4,5}; int (*pa)[5]; pa=a; (*pa)[0] (*pa)[1] (*pa)[2] 로 사용
2차원 배열과 포인터 연산
2차원 배열로 생성해도 1행->2행->3행 순으로 메모리에 저장 ∴포인터를 이용하여 2차원 배열을 탐색 가능
함수 포인터
함수 포인터 : 함수를 가리키는 포인터. 함수도 메모리에 존재하기 때문에 함수 주소를 가져올 수 있다.
int (*pf)(int,int); -> pf가 먼저 포인터가됨 -> int 함수(int,int) 함수를 가리키는 포인터가 됨
함수 포인터 배열 : 같은 반환타입, 매개변수를 사용하는 함수를 여러개 저장하는 배열
int (*pf[5])(int,int);
const 포인터
const를 붙이는 위치에 따라서 의미가 달라짐
const char *p : p가 가리키는 내용이 변경되지 않음을 나타냄
char *const p : 포인터 p가 변경되지 않음을 나타냄
구조체
구조체 : 다른 타입의 집합
구조체 선언 형식
struct 구조체이름{
자료형 멤버1;
자료형 멤버2;
...
};
구조체를 선언할 때 구조체, 포인터를 멤버로 가질 수 있다.
구조체 변수 선언
변수 : struct 구조체이름 변수명;
배열 : struct 구조체이름 변수[크기];
선언과 동시에 초기화 가능
struct student s1 = {24, “Kim”, 4.3};
struct student s2[3]={{1,“Park”,172.8},{2,“Kim”,179.2},{3,“Lee”,180.3}};
구조체 멤버를 참조하려면 .연산자를 사용함
ex) s1.number = 26; s1.grade=4.3;
같은 구조체 변수끼리 대입은 가능하나 비교가 불가능
구조체와 포인터
struct 구조체이름 *p; p=&s1;
포인터를 사용시 ‘.’연산자, ‘->’연산자 사용 가능
ex)동일한 기능 (*p).number (*p).name, p->number p->name
구조체와 함수
구조체를 함수의 인수로 전달할 경우 : 구조체의 복사본이 함수로 전달되어 메모리 소비가 커짐
구조체의 포인터를 함수의 인수로 전달할 경우 : 원본이 훼손될 수있으나 시⚫공간 절약가능
int equal(struct 구조체이름 const *p1) : const를 추가함으로써 포인터를 통한 구조체의 변경을 막는 것
함수에서 구조체 반환시 구조체의 복사본을 반환
공용체 : 같은 메모리 영역을 여러 개의 변수가 공유, 공용체를 선언하고 사용하는 방법은 구조체와 비슷
공용체 선언 형식
union 공용체 명{
char c;
int i; //i와 c는 같은 공간을 활용
};
[출처] 함수, 배열, 포인터, 구조체|작성자 길가다주은노트북
'프로그래밍 > C' 카테고리의 다른 글
(C언어) 후위표기 수식의 연산 프로그램 (0) | 2016.07.09 |
---|---|
(C언어) 이중 연결 리스트의 원소 삭제 알고리즘 (0) | 2016.07.09 |
(C언어) 원형 연결 리스트의 첫 번째 노드 삽입 알고리즘 (0) | 2016.07.09 |
(C언어) 연결형 리스트 탐색 알고리즘 구현 (0) | 2016.07.09 |
(C언어) 배열 연습 문제 (0) | 2016.07.09 |