C언어 기본 개념(포인터, 구조체)

김경환·2021년 7월 23일

C/C++

목록 보기
2/5

포인터

포인터는 값을 저장하는 것이 아닌 메모리 주소를 저장하는 변수이다.
포인터를 선언할 때 *를 붙여준다
Int a=3; int *b = &a;형식으로 사용한다.
이 경우 b가 가리키고 있는 주소는 a의 주소이므로 b의 값은 3이된다.

포인터는 컴퓨터 시스템의 특정한 메모리에 바로 접근이 가능하다.
따라서 기존에 존재하는 중요한 메모리 영역을 건드리면 안 된다.
어느 주소에 무엇이 들어 있는지 우리는 알 수 없기 때문에 포인터에
직접 주소를 저장하는 것은 매우 위험한 일이다.

배열과 포인터는 내부적으로 기능이 같다.

즉 배열의 이름 자체가 포인터로 사용 가능하다.
Ex) int a[] = {1,2,3}; int *b= a; 이렇게 배열명 앞에 *를 붙이지 않아도 포인터로
인식된다.

Buffer

문자열을 처리할 때 많이 사용되는 개념으로
임시적으로 특정 데이터를 저장하기 위한 목적으로 사용된다.
C는 자동으로 버퍼를 이용해 입출력을 처리한다.
줄바꿈이나 엔터등도 아스키코드로 관리되기 때문에 원치 않는 입력을 받아줄
코드가 필요하다.
While((temp=getchar())!=EOF && temp!=’\n’){}를 이용해 입력 버퍼를 비워줄 수 있다.
EOF는 end of file을 의미하며 getchar()는 한 개의 문자를 입력 받는 코드이다.

문자열

컴퓨터 메모리 구조상에서 마지막에 널(NULL)값을 포함한다.
NULL\0로 표현 가능하며 문자열의 끝을 알리는 목적으로 사용된다.
문자열은 포인터를 사용해 주소를 넣는 것이 가능하다.
Char *a =”hello”; 의 형식으로 사용하며 hello라는 문자열은 읽기 전용으로
메모리에 저장되고 이것을 문자열 리터럴이라한다.

문자열 함수는 <string.h>라이브러리에 포함되어 있다.

  • Strlen() – 문자열의 길이를 반환
  • Strcmp() – 문자열 1이 문자열2 보다 사전적으로 앞에 있으면 -1 아닐 시 1을 반환
  • Strcpy() – 문자열을 복사
  • Strcat() – 문자열 1에 문자열 2를 더함
  • Strstr() – 문자열 1에 문자열 2가 어떻게 포함되어 있는지를 반환

동적 메모리 할당

C언어에서는 배열의 경우 사전에 적절한 크기만큼 할당해 주어야한다.
우리가 원하는 만큼만 메모리를 할당하고자 할 때 사용하는 것이 동적
메모리 할당이다.

<stdlib.h>라이브러리 내에 있는 Malloc()함수를 이용해 원하는 만큼의 메모리 공간 확보 가능.
성공 시 주소를 반환 / 실패 시 NULL을 반환
반드시 free()함수로 메모리 해제를 해주어야 한다. 그렇지 않으면 메모리에 남아 있어 추후에 오류를 발생시킬 가능성이 높다.

구조체

여러 개의 변수를 묶어 하나의 객체를 표현하고자 할 때 사용.

Struct 이름{
Char name[10];
Int age;
Char gender[5];
} ; 

의 형식으로 사용된다.
만든 후 사용하고 싶은 곳에서 struct 이름 변수명; 으로 선언 후 사용이 가능하나

 Struct 이름{
}변수명; 

처럼 구조체 생성시 변수명을 정해 줄 수도 있다.

Typedef를 사용하면 코드를 더 짧게 줄일 수 있다.

구조체 정의 시 typedef를 앞에 붙여준다면 main함수에서 struct를 선언하지 않아도 알아서 인식한다.

Ex) #include <stdio.h> 
#include<stdlib.h>

typedef struct student{
	char name[5];
	int age;
	char gender[5];
}student;

int main(void) {
	student s = { "kim","22","man" }; //전체를 정의
	strcpy(s.name ,"park"); //한개씩 정의할 시 .을 붙여 구분해준다.

}

만약 포인터를 사용시

int main(void) {
	student* s = malloc(sizeof(student));
	strcpy(s->name, "lee"); //.대신 ->를 사용

} 

로 사용 가능하다.

0개의 댓글