printf("ho_tari\n");

ep.23 문자열, 포인터2 본문

두산 로보틱스 부트캠프 ROKEY/C 교육

ep.23 문자열, 포인터2

호타리 2024. 8. 7. 09:57

2024.8.7

• 포인터 변수에 사용할 수 있는 연산, 결괏값의 자료형, 연산의 결괏값

• C 언어의 포인터는 배열과 밀접하게 관련

배열 이름은 배열의 시작 주소

• 배열의 변수 이름은 배열의 시작 주소를 나타내는 포인터 변수
• 하지만 일반 포인터 변수와는 달리 배열 변수는 다른 주소 저장 불가

포인터 연산을 이용한 배열 접근

포인터 변수와 증감 또는 복합 연산자를 이용한 배열 접근

배열에서 인덱스를 표현하는 []는 연산자임

• 배열에서는 안되지만, 포인터와 사용할 때 음수 인덱스도 사용 가능

포인터 연산자의 우선순위
• 괄호의 유무에 따른 동작

배열 == 포인터?
• 배열이 포인터 연산을 이용해서 구현되기는 하지만, 배열과 포인터가 같지는 않음
• 배열 이름은 배열의 첫 번째 요소의 시작 주소
• 배열 이름을 sizeof 연산자에 전달하면 배열의 크기 반환
• 포인터는 주소만 저장하는 변수
• 함수의 반환_자료형에 포인터는 사용 가능/배열은 사용하지 못하는 것도 차이점

함수에 포인터를 전달하면 얻을 수 있는 효과

포인터 매개변수로 함수 외부 변숫값 변경

포인터 매개변수로 함수에 큰 데이터 효율적으로 전달하기

함수에 배열 전달

함수 이름의 의미와 함수 자료형
• 함수 이름 : 함수 코드가 있는 메모리 주소
• 함수를 구별하는 방법 : 함수의 반환 자료형 및 매개변수를 확인
• 함수나 매개변수의 이름은 중요하지 않음

함수 포인터 자료형 선언
• 함수 포인터 변수를 선언에 typedef 붙이기

• 매개변수 이름 생략

void 포인터 자료형

• 자료형이 정해지지 않은 특별한 포인터 자료형

세 가지 특징
• void 포인터로 선언된 변수는 어떤 자료형의 포인터 값이라도 저장 가능
• 매개변수를 void 포인터로 선언하면, 함수를 호출할 때 어떤 자료형의 포인터라도 전달 가능
• void 포인터로 선언된 변수는 간접 참조를 통해 값을 저장하거나 사용 불가

 

문자열(string)은 널 문자('\0')로 종료되는 일련의 문자 배열

문자 배열 형태로 선언되는 문자열
• 크기 없이 문자 배열을 선언하고 문자들로 초기화

• 정해진 크기의 배열을 선언하고 문자열 초기화

• 문자 배열을 선언하고 문자열 상수로 초기화

포인터 변수로 선언되는 문자열
• char 형 포인터 변수를 선언하고 문자열 상수로 초기화
• 포인터 변수에 문자열 상수의 주소가 저장됨

문자열 상수는 변경 안됨

문자열을 다른 문자 배열에 저장하려면 strcpy() 함수 사용

문자열과 메모리 구조
• 배열로 선언되는 문자열은 일반 변수처럼 메모리에 저장됨
• 함수 밖이나 정적 지역변수로 선언한 문자 배열은 전역변수가 저장되는 데이터 영역에 만들어짐
• 반대로 지역변수로 선언하는 문자 배열은 스택에 공간 확보
• 문자열 상수는 프로그램에서 사용하는 상수들을 저장하는 곳에 생성됨
• 일반적으로 상수들은 데이터 영역에 저장됨
• 포인터 변수에 문자열 상수를 저장할 때 포인터 변수는 변수 선언 위치에 따라 데이터나 스택에 저장됨

키보드로 문자열 입력받기

• scanf() 함수

▪ gets() 함수

• fgets() 함수

fgets() 함수가 함수 실행을 종료하고 반환하는 경우

포인터 배열 목적

함수 포인터 배열
인터럽트(interrupt)
• 보통 번호가 붙으며 다양한 종류가 있음
• 예를 들면, 키보드 입력, 마우스 입력같은 작업들이 인터럽트로 처리
• 숫자를 0으로 나누었을 때 인터럽트가 발생
인터럽트 핸들러(interrupt handler)
• 인터럽트 핸들러 또는 인터럽트 서비스 루틴(interrupt service routine)
• 특정 인터럽트가 걸렸을 때 실행되는 코드
인터럽트 벡터(interrupt vector)
• 인터럽트 핸들러의 코드 위치를 저장한 1차원 배열

포인터의 포인터
• 포인터의 포인터는 포인터 변수를 가리키는 포인터
• ‘이중 포인터(double pointer)’라고도 함
• 포인터의 포인터는 변수를 선언할 때 ‘*’ 기호를 두 개 붙임
• 포인터를 사용하는 문자 배열처럼 typedef를 사용하면 일반 포인터처럼 단순화도 가능

문자열과 숫자의 변환

• 숫자를 문자열로 변환하는 것은 sprintf()나 snprintf()를 사용
• 문자열을 숫자로 변환하는 것은 sscanf() 함수를 사용
• C 표준 라이브러리는 이것 외에 문자열을 숫자로 변환하는 여러 가지 함수들을 제공

str
• 변환할 숫자를 저장한 문자열
ptr
• 변환 과정에서 오류가 없는지 확인하는 데 필요
• 변환된 값이 자료형의 범위가 넘어 오버플로(overflow) 또는 언더플로(underflow)가 발생하면 정해진 값들이 반환
errno
• C 표준 라이브러리에서 오류를 표기하기 위해 사용하는 전역변수

문자열 복사
▪ strncpy() 함수

문자열 길이 확인
▪ str
• str의 길이를 바이트 단위로 반환
• 빈 문자열(널 문자가 가장 첫 번째 문자인 문자열)은 0을 반환

문자열 연결
▪ strcat() 함수
• dest 문자열 뒤에 src를 덧붙이고 dest를 반환
• src가 빈 문자열이라면 strcpy()와 동일한 효과

문자열 비교
▪ strcmp()와 strncmp() 함수
• 두 함수는 문자열 s1과 s2를 사전식으로 비교
• src가 빈 문자열이라면 strcpy()와 동일한 효과

• s1이 s2보다 작다는 것은 두 가지로 구분

문자열 잘라내기
▪ strtok() 함수

일정한 값으로 메모리 공간 채우기
▪ memset() 함수

다른 메모리 공간과 메모리 공간의 비교
▪ memcmp() 함수

다른 메모리 공간에 메모리 공간 복사
▪ memcpy()와 memmove() 함수
• 정수 배열 100개를 arr로 선언
• 초기화한 다음 다른 배열 arr2에 memcpy( ) 함수를 이용해서 복사

메모리 영역에서 특정 값 찾기
▪ memchr() 함수

명령행 인자

• 프로그램을 실행하면서 필요한 정보를 전달하는 문자열
• 윈도우와 리눅스(혹은 맥) 운영체제의 터미널 환경에서 파일을 복사할 때 사용하는 명령

 

오늘 오후 수업시간에는 파이썬 정규 평가가 이루어졌다. 코딩 시험이라니..