Chapter1. 1차원 배열

  • 배열의 이해와 배열의 선언 및 초기화 방법
    • 배열이란? 둘 이상의 변수를 모아놓은것으로 '나란히' 선언되어 있음
    • 1차원 배열의 선언에 필요한것 세가지 ex) int oneDimArr [4];
      1. 배열이름 oneDimArr
      2. 자료형 int
      3. 길이정보 [4]
    • 배열의 위치 정보를 명시하는 인덱스값은 1이 아닌 0에서부터 시작된다
    • arr[idx] = 20; 으로 배열에 접근했을 때 idx+1번째 요소에 20을 저장한다
    • 배열의 초기화
      1. 배열의 길이정보가 명시되있고, 초기 값이 배열의 요소를 다 채울정도 ex)int arr[5] = {1, 2, 3, 4, 5}
      2. 배열의 길이정보가 명시되지 않음 ex) int arr[ ] = {1, 2, 3, 4, 5} // 컴파일러가 자동으로 채워줌(5로)
      3. 배열의 길이보다 적게 초기값이 선언됨 ex) int arr[7] = {1, 2, 3} // 나머지 값은 0으로 초기화 됨
  • 배열을 이용한 문자열 변수의 표현
    • char형 배열의 문자열 저장과 '널(NULL)' 문자
      • char str[14]="Good mornig!"; 선언시, char str[ ] ="Good mornig!" // 마지막 널문자 개수도 포함해 14개 이다 
        G o o d   m o r n i n g ! \0
    • 널 문자란? : 문자열의 끝을 나타내는 기호로 정수형으로 0으로 표현됨, 컴파일러가 문자열의 끝으로 인식하게 함
    • scanf 함수를 이용한 문자열의 입력 (%s), 이때 char형 배열의 경우 &연산자를 삽입하지 않는다
      • ex) scanf("%d", &num); scanf("%s", str);
    • scanf 함수로 입력받은 문자열도 끝에 널문자(\0)가 삽입된다
    • char arr1[ ] = {'H', 'i', '~'}; // 문자배열, char arr2[ ] = {'H', 'i', '~', '\o'} // 문자열
    • scanf 함수의 문자열 입력 특성으로 공백문자를 입력하지 못한다. scanf에서 공백은 데이터를 구분짓는 기준이기 때문
    • scanf함수로 He is my friend 를 입력받으면 "He", "is", "my", "friend" 이렇게 총 4개의 문자열이 입력된 것으로 인식한다

Chapter2. 포인터의 이해

  • 포인터란 무엇인가?  // C언어가 Low 레벨 언어의 특성을 지닌다고 할 수 있게 하는 장본인!
    • 포인터 변수(메모리의 주소 값 저장을 목적으로 선언됨)
      • 변수가 선언되면 다음과 같이 메모리상에 존재하게 되고 이때 각 '메모리의 주소 값'을 할당받게 된다!
      • ex) char ch1 = 'A', ch2 = 'Q';, int num = 7;
             
      • 이때 A의 메모리의 주소 값은 0x12ff74 이고 이것을 저장하는 형태가 포인터 변수 이다!
    • 포인터 변수와 &연산자
      • &연산자는 피연산자의 주소 값을 반환하는 연산자 이다
      • ex) int num=7; int* pnum; pnum = #
           
      • 포인터 변수 pnum이 int형 변수 num을 가리킨다 라고 표현함, pnum에 num의 시작번지 주소가 저장됨!
      • 포인터 변수의 크기는 시스템이 32비트인지 64비트인지에 따라 4byte, 8byte인지가 정해짐
    • 포인터 변수 선언하기
      • type * ptr; 형태 // int *, double *, float * 등의 타입
      • 이때 '포인터 형'(int *, char * 등) 또한 자료형 의 범주에 포함시키기도 한다
      • int * // int 형 포인터, int * pnum1 // int 형 포인터 변수 pnum1
  • 포인터와 관련 있는 연산자 (&연산자, *연산자)
    • 변수의 주소 값을 반환하는 &연산자
      • &연산자의 피연산자는 변수여하 함
      • 변수의 자료형에 맞지 않은 포인터 변수의 선언은 문제가 됨(↓ 설명)
    • 포인터가 가리키는 메모리를 참조하는 *연산자 (포인터 형을 선언할때 사용하는 *과는 다르다)
      • *연산자는 포인터가 가리키는 주소값의 메모리 공간(값)에 접근할 때 사용하는 연산자이다
      • ex) int num = 10; int* pnum = # *pnum = 20; // 이때 *pnum은 num의 값을 뜻하므로 num이 20이 됬다
      • 따라서 *pnum과 num이 의미하는 것은 같다!!
    • 다양한 '포인터 형'이 존재하는 이유!
      • 포인터 형은 메모리 공간을 참조하는 기준이 된다! (*연산과 관계)
      • ex) return *pnum; 만 보고는 pnum에 저장된 주소를 시작으로 몇 바이트 읽어들여 정수,실수 중 어느 것으로 해석해야 하는가를 알 수 없다
      • int* pnum; 으로 선언되있다면 pnum에 저장된 주소를 시작으로 4byte 읽어들여 정수로 해석하면 된다!!
      • 만약 double 형에 int* 형 포인터를 연결한다면 8byte크기에 실수 형태로 저장된 값을 4byte크기에 정수 형태로 읽어오기 때문에 알수없는 값이 저장된다
      • 포인터 형이 존재하지 않는다면 *연산을 통한 메모리 접근이 불가능하다
    • 잘못된 포인터의 사용과 널 포인터
      • 잘못된 포인터의 초기화 ex) int* ptr = 125; *ptr = 10; // 이때 125주소값에 접근하면 시스템 전체에 문제를 일으킨다!
      • 이때 포인터 변수를 선언한 후 초기화 시 널포인터(0)을 사용한다
      • ex)int* ptr=0; or int* ptr=NULL; 이때 0은 0주소값을 의미하지 않고 NULL값을 의미한다
      • 널포인터의 의미는 '아무것도 가리키지 않는다!' 란 뜻이다.

'IT공부 > 윤성우 열혈 C프로그래밍' 카테고리의 다른 글

포인터와 배열의 시작_3  (0) 2022.02.05
포인터와 배열의 시작_2  (0) 2022.02.04
C언어의 기본_4  (0) 2022.01.29
C언어의 기본_3  (0) 2022.01.26
C언어의 기본_2  (0) 2022.01.26

+ Recent posts