C언어

C언어 <문자열> <함수 포인터>

um_coding 2023. 7. 26. 14:57

배열로 문자열 선언

1.메모리 공간을 미리 할당하는 방법

ex) char a[11] = "hello world";

메모리를 미리 할당한다.

 

2. 컴파일러가 문자열 길이를 보고 알아서 할당시켜주는 방법

ex) char a[]="hello world";

메모리 공간은 컴파일러가 알아서 할당한다.

 

포인터 문자열 선언

포인터로 선언하는 방법

*a : 포인트 변수

 

char*a= "hello world"

코드 작성 순서

1. 메모리 어딘가에 "hello world"가 할당된다.

2. char *a변수가 선언된다.

3. a는 h의 주소값을 가리킨다. (*a='h')

 

여기서 a라는 변수는 포인터 변수로 선언되었기 에 주소값을 저장할 수 있다.

저 주소값은 문자열의 첫 번째 항을 가르킨다. 즉 'h'문자를 가리키고 있다.

 

하지만 배열의 문자열 선언과 다른 점은 "hello world"라는 문자열은 메모리 어딘가에 선언이 되었는데,

이는 상수형 문자열 특성을 지니므로 마음대로 문자 하나 하나를 변경할 수 없다.

 

포인터 변수 a는 h의 주소를 가르키므로 *a출력하면 'h'가 출력되고, *(a+1)로 출력하면 그 뒤에 있는 문자인 'e'가 출력된다.

단, "hello world" 전체는 상수형으로 할당되었기 때문에  임의로 배열을 변경할 수 없다.

즉, 상수는 변할 수 없는 값이므로 *a= 'k'  이런 식으로 포인터 값을 변경할 수 없다.

포인터로 선언하고 변경을 원할 시, 다른 문자열 주소를 넣어주어야 한다.

즉, 메모리 어딘가 상수형으로 선언된 기존의 문자열을 버리고, 새로 변경된 문자열을 선언해야 한다.

 

배열로 문자열로 선했을 때

포인트 문자열을 선언했을 때

문자열 관련 함수

1.  strlen()

2. strcmp()

3. strcpy()

4. strcat()

문자열 관련 함수를 사용하려면 #include <string.h> 헤더 파일을 사용해야 한다.

 

1.  strlen(): 문자열의 길이를 반환해 주는 함수

입력받은 주소를 NULL문자까지의 거리를 이용해 길이를 측정한다.

길이를 반환하기 때문에 int 변수를 사용할 수도 있다.

2. strcmp(): 입력받은 두 개의 문자열을 서로 비교하는 함수이다.

strcmp()함수는 비교결과를 3가지 경우로 분류한다.

 

두 문자열이 같은 경우 0,  첫 번째 문자열이  사전순으로 빠를 경우 -1, 느릴 경우 1을 반복한다.

 

사전순이 뭘까?

문자열을 비교하여 사전순(알파벳 순서)으로 빠른지,  같은지, 느린지를 판단하는 것이다.

ex)  "apple"과  "banana"를 비교하면

a가 b보다 알파벳 순서가 먼저이므로 "apple"이  banana"보다 사전순으로 빠르다는 것이다.

3. strcpy(): 문자열을 복사 붙여넣기하는 함수이다.

 

strcpy()는 두번째 문자열을 첫 번째 문자열로 복사하는 함수이다.

즉, 두 번째 문자열의 내용이 첫 번째 문자열에 복사되어 저장된다.

4. strcat(): 두 개의 문자열을 하나로 합치는 함수이다.

첫 번째 문자열의 뒤에  두 번째 문자열을 따라 붙는 식으로 합쳐지고, 두번째 문자열은 변하지 않는다.

함수 포인터

프로그램에서 정의된 함수는 프로그램이 실행될 때 모두 메인 메모리에 올라가게 된다.

이때 함수의 이름은 메모리에 올라간 함수의 시작 주소를 가리키는 포인터 상수가 된다.

이렇게 함수의 시작 주소를 가리키는 포인터 상수를 함수 포인터라고 부른다.

 

함수의 포인터의 포인터 타입은 함수의 반환값과 매개변수에  의해 결정된다.

즉, 함수의 원형을 알아야만 해당 함수에 맞는 함수 포인터를 만들  수 있다.

 

함수 원형

void func(int, int);

 

함수 포인터

void(*ptr_func)(int, int);

함수 포인터 사용 시 연사자의 우선순위 때문에 반드시 *ptr_func부분을 괄호로 둘러싸야 한다.

 

void

함수 포인터가 가르킬 함수의 반환 타입 'void'인 것을 의미한다.

즉, 해당 함수는 반환값이 없는 함수를 가리키는 함수 포인터이다.

 

ptr_func

함수 포인터의 이름이다.

 

(*ptr_func)

함수 포인터를 가리키는 것을 의미한다. *는 포인터임을 나타내는 연산자이다.

 

(int, int)

함수 포인터가 가리킬 함수의 매개변수 타입을 나타낸다.

이 경우, int 타입 두 개의 매개변수를 받는 함수를 가리키는 함수 포인터이다.

 

void 포인터

void 포인터는 일반적인 포인터 변수와는 달리 대상이 되는 데이터의 타입을 명시하지 않는 포인터이다.

따라서 변수, 함수, 포인터 등 어떠한 값도 가리킬 수 있지만, 포인터 연산이나 메모리 참조와 같은 작업은 할 수 없다.

즉, void포인터는 주소값을 저장하는 것 이외에는 아무것도 할 수 없는 포인터이다.

또한, void포인터를 통해 메모리를 접근하기 위해 명시적 형 변환을 하는 방식 *(데이터 타입*)변수 이름

 

 

'C언어' 카테고리의 다른 글

C언어 <가변인자>  (0) 2023.08.05
C언어 <전치행렬>  (0) 2023.08.05
C언어 <포인터>  (0) 2023.07.25
C언어 <배열>  (0) 2023.07.24
C언어 <함수>  (0) 2023.07.21