본문 바로가기
IT/C

[C언어] 기초 내용 정리 (배열, 포인터 변수)

by dwoi 2023. 3. 24.

본 내용은 C언어의 배열 및 포인터 변수에 대해서 공부한 내용을 정리한 글

 

목차

     


    C언어

     


    1. 배열

    1.1. 배열이란

    • 같은 자료형을 가진 연속된 메모리 공간으로 이루어진 자료 구조
    • 같은 자료형을 가진 변수들이 여러 개 필요할 떄 사용
    • 많은 양의 데이터를 처리할 떄 유용

    1.1.1. 배열의 선언

    • 자료형 : 배열의 자료형을 지정
    • 배열 이름 :  변수 선언하듯이 배열을 선언
    • 배열 길이 : 배열 요소의 총 길이,
      • 배열 길이를 변수로 설정하면 안 되고 상수로 설정해야 한다.

    ※ 배열 요소는 0부터 시작


     

    2. 다차원 배열

    다차원 배열 : 2차원 이상의 배열을 의미

    즉 원래는 같은 행에 데이터를 나열해서 정리했다면

    이제 행과 열이 추가되서 2차원, 3차원으로 차원이 증가된 배열

    ※ 1차원 배열 선언과 비슷한 방법으로 선언하지만 배열 길이를 선언할때 행[가로], 열[세로]를 지정한다.

    • 행 단위로 2차원 배열의 선언과 동시에 초기화도 가능 : 중괄호 중첩

     


     

    3. 포인터

    3.1. 포인터란?

    포인터 변수(포인터) : C언어의 장점

    • 메모리의 주소를 저장하고 있다가 해당 주소로 데이터를 전달 하는 일
    • 메모리의 주소를 저장하고 있다가 해당 주소로 데이터를 참조 하는 일

    → 즉 주소를 저장하는 변수

    3.1.1. 포인터의 장점

    • 메모리 주소를 참조해 다양한 자료형 변수들의 접근과 조작 용이
    • 메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이
    • 동적 할당된 메모리 영역(힙영역)에 접근과 조작 용이

     

    3.1.2. 포인터 변수의 선언

    ①. 자료형 뒤에 *붙여줌

    ②. 포인터 변수 이름 선언

    ③. Null로 포인터 변수 초기화!

     

    ‘모든 포인터 변수는 4바이트 이다

     

    ※ 포인터 변수를 잘못 선언하는 경우

    1. 변수에 주소를 선언하지 않은 경우
    2. 이상한 주소 저장하는 경우

     

    3.2. 다차원 포인터 변수

    • 2차원 이상의 포인터 변수
    int** ip = NULL;

     

    3.2.1. 2차원 포인터 변수의 역할

    • 1차원 포인터 변수의 주소를 저장
    #include <stdio.h>
    int main(void)
    {
    int num=10;
    int* p1=NULL;
    int** p2=NULL;
    p1=&num;
    p2=&p1; 
    return 0;
    }

     

    3차원 포인터 변수 : 2차원 포인터 변수의 주소를 저장

     

    3.3. 주소의 가감산

    주소를 + - 연산도 가능

     

    3.4. 함수 포인터

     

    ①. 자료형 : 가리키는 대상이 되는 함수의 자료형을 설정

    ②. 함수 포인터 이름괄호와 *을 반드시 사용

    ③. 인수 자료형 목록 

    3.4.1. 함수 포인터의 필요성


    • 일반적인 함수 호출보다 빠른 처리 속도를 기대한다
    • 사용 분야 : 컴파일러, 인터프리터, 게임 프로그래밍과 같은 시스템 프로그래밍 분야

     


     

    4. 포인터와 배열

    배열의 주소도 포인터로 지정해서 사용할 수 있음. (1차원, 2차원, 3차원) → 배열 포인터

    • 포인터 변수를 통한 1차원 배열 요소의 주소 접근
       배열의 시작 주소를 저장 가능

    또한 포인터들을 배열로 묶어서 사용도 가능 → 포인터 배열

    4.1. 배열 포인터

    ①. 자료형 : 배열 포인터 변수가 저장하는 배열의 자료형

    ②. 배열 포인터 변수 이름 : 연산자와 배열 포인터 변수 이름을 함께 괄호로 묶음

    ③. 열의 길이 : 배열 포인터 변수가 가리키는 배열의 열의 길이를 지정

     

    4.2. 포인터 배열 

    ①. 자료형 : 포인터 배열의 자료형을 지정하고 *을 붙임

    ②. 포인터 배열 이름 : 주소를 저장할 배열의 이름을 지정

    ③. 배열 길이 : 주소를 저장할 배열의 전체 길이를 지정

     

    4.3. 문자 배열과 포인터

    • 문자 상수
      • 작은따옴표 (‘ ‘) 내에 포함된 하나의 문자
      • 키모드로 표현할 수 있는 영문자와 숫자, 특수 기호
      • 문자 그 자체
    • 문자 배열
      • 문자 상수를 저장하고 있는 배열
      • 배열에 저장된 문자 변경 가능
    •  문자 배열과 포인터
      • 배열에 저장된 문자를 포인터를 통해 접근

     

    4.4. 문자열과 널(Null) 문자

    • 문자열의 특징
      • 큰따옴표 (“ ”) 내에 포함된 하나 이상의 문자
      • 문자열의 끝에는 문자열의 끝을 알리는 널(Null)문자 즉, 종료 문자(\0) 삽입
      • 문자열의 시작 주소를 알면 저장된 문자들에 접근 가능
      • 문자열은 문자열 상수와 문자열 변수로 구분
      • 문자열을 입력하고 출력할 때 서식문자 %s를 사용
    • 메모리 공간에 연속으로 저장되어 있어 주소가 연속적이다
    • 문자열의 시작 주소를 알면 모든 문자들에 접근 가능하다
    • %s는 문자열의 시작 주소부터 종료 문자(\0)를 만날 때 까지 문자열을 출력

     

    4.5. 널(Null) 문자와 널(NULL) 포인터

    • 널(Null) 문자
      • 종료문자 ‘\0’
      • ASCII 코드 정수 0(10진수)
      • 문자열 끝에 저장
    • 널(NULL) 포인터
      • 주소로 0을 의미
      • 포인터 변수에 아무 주소도 저장하지 않겠다는 의미
      • 널 포인터를 사용할 때는 반드시 대문자를 사용

     

    4.6. 포인터 변수의 상수화

    • const 키워드를 이용해 포인터 변수를 상수화

     

    • 포인터 변수의 상수화의 의미
    ① 포인터 변수에 다른 주소를 저장하지 못하게 한다.
    ② 포인터 변수를 통해 메모리 공간의 값을 변경하지 못하게 한다.

    → 다른 주소가 들어오면 안되는거나 변경되면 안되는 값을 선언할 떄 사용

     

     

    마무리

    포인터 관련해서 개념이 혼란스럽게 섞일 수 있는 점을 주의!

    손으로 디버깅해가면서 개념을 익혀야되는 점이 필요!

     

     

     

     

     

     

     

     

    댓글