C 15

포인터 배열과 포인터 배열의 포인터 형

포인터 배열과 포인터 배열의 포인터 형 1차원 배열의 포인트 형은 배열의 첫번째 요소의 자료형에 따라 결정된다. 1차원 포인터 배열도 마찬가지이다. int * intarr[20]; double * dbarr[10]; 위에서 선언된 배열 intarr의 첫번째 요소는 int형 싱글포인터이다. 따라서 배열 intarr의 포인터 형은 int형 더블포인터가 된다. 마찬가지로 배열 dbarr는 double형 싱글포인터를 요소로 가지므로 double형 더블포인터가 된다. int num1=10, num2=20, num3=30; int * ptr1=&num1; int * ptr2=&num2; int * ptr3=&num3; int * ptrArr[3]={ptr1, ptr2, ptr3}; int **pptr=ptrArr;..

C 2022.09.23

이중 포인터

이중 포인터 포인터의 포인터를 이중 포인터 또는 더블 포인터라고 한다. 이중 포인터 변수는 * 연산자를 두번 사용하여 나타낸다. 싱글 포인터 변수는 변수의 주소를 저장한다. 이중 포인터 변수도 마찬가지로 주소를 저장하는데 그 대상이 포인트 변수라는 점만 다르다. int num = 100; int * ptr = # int ** pptr = &ptr; 위와 같이 사용할 수 있다. num == *ptr == **pptr 모두 num을 의미한다. int num = 100; int * ptr = # int ** pptr = &ptr; num = 200; *ptr += 10; **ptr += 20; printf("num = %d \n", num); printf("*ptr = %d \n", *ptr);..

C 2022.09.22

C 다차원 배열

다차원 배열 다차원 배열은 2차원 이상의 배열을 말한다. 2차원, 3차원, 4차원 ... C언어는 4차원 이상의 배열도 문법적으로는 허용한다. 그러나 4차원 이상의 배열은 불필요하고 논리적으로 이해하기도 힘들기 때문에 다차원 배열은 2, 3차원 배열을 말하는 것으로 이해하는 것이 좋다. 선언 방법은 다음과 같다. 자료형 배열명[세로][가로];//2차원 배열 자료형 배열명[세로][가로][높이];//3차원 배열 1차원 배열 선언 시에는 []안의 수가 요소의 수를 의미했지만 다차원 배열에서는 순서대로 세로, 가로, 높이를 의미한다. 2차원 배열은 면으로, 3차원 배열은 직육면체 개념으로 생각하면 이해가 쉽다. 그렇다면 실제 메모리에도 면, 직육면체 형태로 할당되어 있을까? 메모리는 1차원 구조이기 때문에 실제..

C 2022.09.20

C 공부 12일차 Chapter 14 포인터 대상 const 선언의 두가지 형태

포인터 대상 const 선언 포인터 변수를 대상으로 const 선언을 하는 데에는 두가지 형태가 있다. 첫번째는 포인터 변수가 참조하는 대상의 값을 변경하지 못하는 형태이다. 아래 코드와 같이 포인터 변수 선언의 맨 앞부분에 const가 위치하면 포인터 변수가 가리키는 대상의 값을 변경하지 못한다는 의미가 된다. 선언방법은 다음과 같다 int num = 20; const int * ptr = # *ptr = 40;//컴파일 오류 num = 40;//컴파일 오류 발생하지 않음 따라서 *ptr=30 과 같은 문장 작성 시 컴파일 오류가 발생한다. 그러나 변수 num이 상수화 되는 것은 아니기 때문에 num=40 처럼 변수에 저장된 값은 컴파일 오류없이 변경이 가능하다. '포인터 변수가 가리키는 대상'..

C 2022.09.17

C 공부 11일차 Chapter 14 함수 호출 방식 Call-by-value, Call-by-reference

Call-by-value, Call-by-reference 함수 호출 방식은 함수 인자로 전달되는 대상에 따라 2가지로 나눌 수 있다. 단순히 값을 전달하는 형태이면 Call-by-value 메모리에 접근 가능한 주소값을 전달하는 형태면 Call-by-reference로 구분 가능하다. 이와 같이 호출 방식을 구분하는 이유는 다음과 같다. 예를 들어 두 값을 전달받아 서로 값을 교환하는 swap 함수를 작성한다고 하면 Call-by-value 형식으로 함수 작성 시 아래와 같다. void swap(int num1, int num2){ int temp = num1; int num1 = num2; num2 = temp; printf("num1=%d, num2=%d", num1, num2); } int mai..

C 2022.09.16

C 공부 10일차 Chapter 14 함수와 포인터

함수와 포인터 배열은 매개변수로 전달할 수 없다. 따라서 배열을 통째로 넘겨주는 것은 불가능하다. 대신 함수에서 배열에 접근하기 위해서는 배열의 주소값을 전달받는다. 함수의 매개변수로 배열 전달받는 방법 함수의 매개변수로 배열을 선언받을 경우 두가지 방법이 있다. 첫번째는 포인터로 전달받는 방식 int func1(int * ptr1){ ... } 두번째는 배열형태로 전달받는 방식이다. int func2(int ptr[]){ ... } 이 두 방식은 매개변수 선언 시에만 동일한 의미로 해석된다. 함수의 매개변수 선언 시에만 int prt[] == int * ptr 이라는 것이다. 매개변수로 전달받은 배열의 길이 함수의 매개변수로 배열의 주소를 받을 경우에는 배열의 길이를 같이 전달해줘야 한다. void f..

C 2022.09.15

C 공부 9일차 Chapter 13 포인터 배열

포인터 배열 포인터 배열이란 포인터 변수들을 저장할 수 있는 배열을 말한다. 따라서 포인터 배열에는 주소값들이 저장된다. 선언 방법은 아래와 같다. int * arr1[3]; char * arr2[2] = {"Hello", "World"}; 일반 배열 선언과 다름없다. 문자열을 가리키는 포인터 배열은 큰따옴표로 묶인 문자열은 형태에 상관없이 메모리 공간에 저장 후 주소 값을 반환함으로 "Hello"가 123456 "World"가 123457에 저장되었다고 한다면 arr2[0] = 123456 arr2[1] = 123457 이 되는 것이다. 다른 자료형들을 가리키는 포인터 배열도 마찬가지이다. 포인터 배열은 가리키는 자료형에 상관없이 해당 데이터가 저장된 주소를 갖고 있는 배열이다.

C 2022.09.14

C 공부 8일차 Chapter 13 문자열 표현의 두가지 방법

문자열 표현의 두 가지 형태 문자열을 표현하는 방식에는 두 가지 방법이 있다. 첫번째는 '변수 형태의 문자열'로 배열에 문자열을 저장하는 방법이다. char str[] = "Hello world"; "Hello world"라는 문장을 배열에 저장하는 방식으로 str에는 문장의 첫글자인 H의 주소값이 저장된다. 이는 배열에 저장된 형태이므로 값의 변경이 가능하다. 그러나 str은 항상 H의 위치를 가리키고 있어야 하므로 가리키는 위치는 변경할 수 없다. 두번째 방법은 '상수 형태의 문자열'로 포인터를 이용해 저장하는 방법이다. char * str = "Hello world"; 이는 char형 포인터 변수에 메모리 공간 어딘가에 저장된 Hell world라는 문자열의 주소값을 저장하는 방법이다. 이 방식은 ..

C 2022.09.13

C 공부 7일차 Chapter 13

포인터 연산 포인터를 대상으로 증감 연산을 실행할 경우 포인터의 형에 따라 증감의 크기가 결정된다. 예를 들어 int형 포인터 ptr에 +2 연산을 할 경우 증감크기(2) * 포인터형의 크기(4) = 8이 증가하게 된다. Type 형 포인터의 크기를 n 만큼 증가 시 ==> sizeof(Type) * n 만큼이 증가하는 것이다. 이를 통해 배열에 순차적으로 접근할 수 있게 된다. int arr[3] = { 11, 22, 33 }; int * ptr = arr; for (int i = 0; i < sizeof(arr)/sizeof(int); i++) printf("%d \n", *(ptr+i)); 위의 코드처럼 배열 접근 시 응용하여 사용이 가능하다. *(++ptr) = 20; *(ptr+1) = 20; ..

C 2022.09.12