본문 바로가기

반응형

Algorithm/C프로그래밍

(37)
[C언어] 배열을 선언할 때 배열의 크기를 생략할 수 있다. 배열을 선언할 때 값을 초기화한다면 배열의 크기를 생략할 수 있다. (초기화 하지 않으면 생략할 수 없다.)
[C언어] 흔하게 발생하는 잘못된 포인터 사용 * 출처: 코딩도장 34.7 잘못된 포인터 사용 * 출처: 최유경 교수님 C 프로그래밍 포인터 수업자료 ▶ 1. 포인터 변수에 직접 값을 입력하는 경우 포인터는 메모리 주소를 저장하는 용도이다. 따라서 값을 직접 저장하면 안 된다. 메모리에서 0x100은 잘못된 주솟값이므로 제대로 실행되지 않는다. 때문에 이 상태에서 numPtr을 역참조하여 메모리 주소에 접근해봐야 에러만 발생한다. 아래와 같은 오류 메시지가 발생한다. - E0144: "int" 형식의 값을 사용하여 "int *" 형식의 엔터티를 초기화할 수 없습니다. - C2440: '초기화 중': 'int'에서 'int *'(으)로 변환할 수 없습니다. ※ 정수 계열 형식에서 포인터 형식으로 변환하려면 reinterpret_cast, C 스타일 캐..
[C언어] 포인터 개념 (6): 이중 포인터 * 출처: 코딩도장 34.6 이중 포인터 사용하기 지금까지 다룬 것은 변수의 포인터이다. (변수의 메모리 주소를 저장) 이제부터 다루는 것은 포인터의 메모리 주소를 저장하는 포인터의 포인터를 사용하는 법이다. 포인터를 선언할 때, *를 두 번 사용하면 포인터의 포인터, 즉 이중 포인터를 선언할 수 있다. 포인터도 변수이므로 메모리 주소를 구할 수 있다. 하지만 특수하게, 포인터의 메모리 주소는 일반 포인터에 저장할 수 없고 이중 포인터에 저장해야 한다. (int **numPtr2; 를 영어로 pointer to pointer to int라 한다.) 이중 포인터 numPtr2를 끝까지 따라가서 실제 값을 가져오려면 변수 앞에 역참조 연산자를 두 번 사용하면 된다. 포인터를 선언할 때 *의 개수에 따라서 삼..
[C언어] 포인터 개념 (5): 범용 포인터인 void 포인터 선언하기 * 출처: 코딩도장 34.5 void 포인터 선언하기 void 포인터는 자료형이 정해지지 않은 포인터이다. 어떤 자료형으로 된 포인터든 모두 void 포인터에 저장할 수 있다. 반대로, void 포인터를 다양한 자료형으로 된 포인터에 저장할 수 있다. 이 때문에 void 포인터를 범용 포인터로 부른다. 직접 자료형을 변환할 필요 없이, 암시적으로 자료형이 변환된다. 단, void 포인터는 역참조(*)를 할 수 없다. (자료형이 정해지지 않았으므로 값을 가져오거나 저장할 크기도 정해지지 않았기 때문이다.) 또한 void 키워드로 변수를 선언하는 것도 컴파일 에러를 일으킨다. void 포인터는 함수에서 다양한 자료형을 받아들일 때, 함수의 반환 포인터를 다양한 자료형으로 된 포인터에 저장할 때, 자료형을 숨..
[C언어] 포인터 개념 (4): 다양한 자료형의 포인터 선언하기 * 출처: 코딩도장 34.4 다양한 자료형의 포인터 선언하기 다양한 자료형의 포인터를 선언해보자. C언어에서 사용할 수 있는 모든 자료형은 포인터로 만들 수 있다. 그런데 왜 포인터 자료형을 따로 만들지 않고 자료형 마다 포인터를 선언하게 하는 것일까? 포인터에 저장되는 메모리 주솟값은 모두 정수형으로 동일하다. 하지만 선언하는 자료형에 따라 메모리에 접근하는 방법이 다르다. 따라서, 다음과 같이 포인터를 역참조하면 선언한 자료형의 크기에 맞추어 값을 가져오거나 저장한다. 예를 들어, long long 포인터는 8바이트 크기만큼 값을 가져오거나 저장한다.
[C언어] 포인터 개념 (3): (역)참조 연산자 * 사용하기 * 출처: 코딩도장 34.2 역참조 연산자 사용하기 * 출처: 최유경 교수님 C 프로그래밍 포인터 수업자료 저번 게시글에서 포인터 변수에는 메모리 주소가 저장되어 있다는 것을 알았다. 메모리 주소가 있는 곳으로 이동해서 값을 가져오고 싶을 때 역참조(dereference) 연산자 *를 사용한다. ■ 포인터 참조 - 포인터 변수가 가리키는 변수에 접근하는 것 - 참조 연산자 * (간접연산자, 포인터 연산자라고 부름) 사용 ex) *pch: 포인터 pch가 가리키는 변수, 0x3C 번지에 저장된 값. *는 포인터 앞에 붙인다. 포인터 변수 앞에 *을 붙이면 그 포인터 변수에 저장된 메모리 주소로 가서 값을 가져온다. 즉, 포인터는 변수의 주소만 가리키며 역참조는 주소에 접근하여 값을 가져온다. *의 사용은 ..
[C언어] 포인터 개념 (2): 포인터 자료형 이해하기 + 포인터 변수 선언하기 * 출처: 코딩도장 34.1 포인터 변수 선언하기 * 출처: 최유경 교수님 C 프로그래밍 포인터 수업자료 저번 게시글에서 변수의 메모리 주소를 구하는 방법을 알아보았다.(변수 앞에 &를 붙인다.) ※ 메모리 주소 값이 포인터 변수에 저장되면, 그 포인터 변수 자체가 공간을 나타낸다. 포인터로 저장되면 공간을 가리키는 효과가 나타난다고 이해하자. 그렇다면 그 메모리 주소는 어디에 저장하는 것일까? 바로 포인터 변수에 저장한다. 포인터 변수는 *를 사용하여 선언하며 포인터 변수를 포인터로 줄여서 부르기도 한다. ■ 포인터 (자료형) - 주소를 나타내는 특수 자료형 - 주소는 기본적으로 양의 정수로 표현되지만, int형과 다르다. - 자료형 *포인터변수이름; - 포인터=& 변수; 포인터 변수를 선언할 때는 자..
[C언어] 포인터 개념 (1): 메모리란? + 포인터 사용하기 * 출처: 코딩도장 34.0 포인터 사용하기 * 출처: 최유경 교수님 C 프로그래밍 포인터 수업자료 ■ 메모리 - 프로그램이 실행되기 위해 필요한 정보를 저장하는 공간 - 1 byte (=8bits) 단위로 물리 주소가 부여 되어 있다. - 메모리는 일렬로 연속되어 있는, 크기가 1 byte인 방들의 모음이라고 볼 수 있다. - 일반적으로 주소의 길이는 4 bytes. 주소는 16진수로 표현. ■ 변수와 메모리의 관계 - 변수는 선언될 때, 메모리에 그 변수를 위한 공간이 할당된다. ■ C 언어에서 변수의 두 가지 의미 1. 그 변수에 할당된 공간(주소는 x): - 선언할 때 - 대입문의 왼쪽 변수(I-value)로 사용될 때 2. 그 변수에 저장된 값: - 대입문의 오른쪽 변수(r-value)로 사용될..

반응형