목차
C언어의 포인터
널 포인터(NULL Pointer)
아스키코드
배열의 포인터
포인터의 포인터
포인터의 형변환
동적할당
널 포인터(NULL Pointer)
아스키코드
배열의 포인터
포인터의 포인터
포인터의 형변환
동적할당
본문내용
것이다.
거기다가 아래의 코드처럼*연산으로 임의의 수를 저장하면 프로그램에 치명적인 결과를 가지고 올 수 있다.
int main(void)
{
int *pnum;
*pnum=200;
}
그렇다면 초기값을 대충 1234로 하면 안 된다. 왜냐하면 이 1234번지가 메모리의 어디에 있는지 알 수 없다. 고로 쓰레기 값으로 채우는 것과 다를 바 없다.
그럼 방법이 없지 않은가?라고 할 수 있다. 하지만 방법은 있다.
바로 NULL값을 이용하는 것이다.
아래의 코드를 보자
int main(void)
{
int *pnum1 = 0;
int *pnum2 = NULL;
}
이 둘이 의미하는 바는 같다 왜 0과 NULL이 같은 의미를 지니는 이유는 0은 *아스키코드에서 NULL이기 때문이다.
그리고 0이 라는 숫자가 들어가면 *pnum1이 0번지를가리키진 않는다.
여기서 0(NULL)의 의미는해당 포인터 변수는 아무것도 가리키고 있지 않다고 할 수 있다.
*아스키코드
●배열의 포인터
배열도 자료형이기 때문에 당연히 배열을 위한 포인터 또한 존재한다.
예제를 통해 알아보도록 하자.
int a[10]; // int [10] 자료형 변수 a. 크기는 40 바이트
int (*p)[10] = &a; // int [10] 자료형의 포인터 변수 p. p의 자료형은 int (*)[10]
(*p)[3] = 3; // a[3] = 3 과 같다.
*p[3] = 3; // a[30] = 3 과 같다. 오버플로우
int *pa = a; // int 자료형의 포인터 변수 pa.
pa[3] = 3; // a[3] = 3과 같다.
변수 p는 변수 a의 주소를 담고 있다. 여기서 p의 크기는 포인터 변수이기 때문에 8바이트 이다.
p를 통해 a에 접근할 때는 *p 또는 p[0] 을 적어주면 됩니다. 이때의 자료형은 int [10] 이며, 크기는 40 바이트 이다.
*p 는 배열을 가리키기 때문에 배열 안에 원소로 접근할 수 있다. 이 경우는 (*p)[3]과 같은 방법으로 접근이 가능하다.
간혹 *p[3] 과 같이 접근하는 경우가 있는데, 이는 p[3][0]과 같기 때문에 위 코드에서는 오버플로우가 된다.
이는 * 연산자의 우선순위가 낮기 때문에 발생하는 문제이므로 사용에 주의하자.
그런데 C언어 강의 시간에는 배열을 저렇게 담지 않고, 변수 pa와 같이 단순히 int형 포인터를 통해 배열을 담았을 것이다.
사실 이 방법은 엄밀하게 말하면 배열의 주소를 포인터변수로 담은 것이 아니다. a[0]의 주소를 포인터로 담은 것이다.
이것은 배열의 성질에 의한것으로, a는 int [10] 자료형이지만 a + 0 은 int * 자료형이 된다.
마찬가지로 sizeof(a) 는 40 바이트이고, sizeof(a + 0) 은 8바이트가 된다.
변수 pa의 경우는 후자처럼 처리가 된 것이고, 이것을 강의시간에는 배열의 이름은 배열의 첫 번째 원소의 주소를 가리킨다고 배웠을 것이다.
다차원 배열의 경우도 위와 같은 방법으로 표시할 수 있다.
●포인터의 포인터
포인터 또한 자료형이기 때문에 마찬가지로 포인터를 위한 포인터도 정의할 수 있다.
예제를 통해 알아본다.
int a; // int형 변수 a. 크기는 4 바이트
int *pa = &a; // int * 자료형 pa. 크기는 8 바이트
int **ppa = &pa; // int ** 자료형 ppa. 크기는 8 바이트
int b[10]; // int [10] 자료형 b. 크기는 40 바이트
int (*pb)[10] = &b; // int (*)[10] 자료형 pb. 크기는 8 바이트
int (**ppb)[10] = &pb; int (**)[10] 자료형 ppb. 크기는 8 바이트
int *c[10]; // int *[10] 자료형 c. 크기는 80 바이트
int *(*pc)[10] = &c; // int *(*)[10] 자료형 pc. 크기는 8 바이트
배열의 경우와 크게 다르지 않다. 만약 변수 ppa를 통해 변수 a에 접근하려면 **ppa 또는 ppa[0][0] 과 같이 적어주면 된다.
변수 ppb는 int [10] 자료형을 가리키는 포인터 int (*)[10] 을 가리키는 포인터이다. 괄호와 *의 위치를 기억해야 한다.
변수 c는 int *의 10개 짜리 배열이다. 따라서 크기는 80 바이트가 된다. 변수 pc는 변수 c의 자료형을 가리킨다.
●포인터의 형변환
포인터는 메모리 주소를 담는 자료형이고, 메모리 주소를 어떤 자료형으로 접근한다고 해도 메모리 주소가 바뀌지는 않
거기다가 아래의 코드처럼*연산으로 임의의 수를 저장하면 프로그램에 치명적인 결과를 가지고 올 수 있다.
int main(void)
{
int *pnum;
*pnum=200;
}
그렇다면 초기값을 대충 1234로 하면 안 된다. 왜냐하면 이 1234번지가 메모리의 어디에 있는지 알 수 없다. 고로 쓰레기 값으로 채우는 것과 다를 바 없다.
그럼 방법이 없지 않은가?라고 할 수 있다. 하지만 방법은 있다.
바로 NULL값을 이용하는 것이다.
아래의 코드를 보자
int main(void)
{
int *pnum1 = 0;
int *pnum2 = NULL;
}
이 둘이 의미하는 바는 같다 왜 0과 NULL이 같은 의미를 지니는 이유는 0은 *아스키코드에서 NULL이기 때문이다.
그리고 0이 라는 숫자가 들어가면 *pnum1이 0번지를가리키진 않는다.
여기서 0(NULL)의 의미는해당 포인터 변수는 아무것도 가리키고 있지 않다고 할 수 있다.
*아스키코드
●배열의 포인터
배열도 자료형이기 때문에 당연히 배열을 위한 포인터 또한 존재한다.
예제를 통해 알아보도록 하자.
int a[10]; // int [10] 자료형 변수 a. 크기는 40 바이트
int (*p)[10] = &a; // int [10] 자료형의 포인터 변수 p. p의 자료형은 int (*)[10]
(*p)[3] = 3; // a[3] = 3 과 같다.
*p[3] = 3; // a[30] = 3 과 같다. 오버플로우
int *pa = a; // int 자료형의 포인터 변수 pa.
pa[3] = 3; // a[3] = 3과 같다.
변수 p는 변수 a의 주소를 담고 있다. 여기서 p의 크기는 포인터 변수이기 때문에 8바이트 이다.
p를 통해 a에 접근할 때는 *p 또는 p[0] 을 적어주면 됩니다. 이때의 자료형은 int [10] 이며, 크기는 40 바이트 이다.
*p 는 배열을 가리키기 때문에 배열 안에 원소로 접근할 수 있다. 이 경우는 (*p)[3]과 같은 방법으로 접근이 가능하다.
간혹 *p[3] 과 같이 접근하는 경우가 있는데, 이는 p[3][0]과 같기 때문에 위 코드에서는 오버플로우가 된다.
이는 * 연산자의 우선순위가 낮기 때문에 발생하는 문제이므로 사용에 주의하자.
그런데 C언어 강의 시간에는 배열을 저렇게 담지 않고, 변수 pa와 같이 단순히 int형 포인터를 통해 배열을 담았을 것이다.
사실 이 방법은 엄밀하게 말하면 배열의 주소를 포인터변수로 담은 것이 아니다. a[0]의 주소를 포인터로 담은 것이다.
이것은 배열의 성질에 의한것으로, a는 int [10] 자료형이지만 a + 0 은 int * 자료형이 된다.
마찬가지로 sizeof(a) 는 40 바이트이고, sizeof(a + 0) 은 8바이트가 된다.
변수 pa의 경우는 후자처럼 처리가 된 것이고, 이것을 강의시간에는 배열의 이름은 배열의 첫 번째 원소의 주소를 가리킨다고 배웠을 것이다.
다차원 배열의 경우도 위와 같은 방법으로 표시할 수 있다.
●포인터의 포인터
포인터 또한 자료형이기 때문에 마찬가지로 포인터를 위한 포인터도 정의할 수 있다.
예제를 통해 알아본다.
int a; // int형 변수 a. 크기는 4 바이트
int *pa = &a; // int * 자료형 pa. 크기는 8 바이트
int **ppa = &pa; // int ** 자료형 ppa. 크기는 8 바이트
int b[10]; // int [10] 자료형 b. 크기는 40 바이트
int (*pb)[10] = &b; // int (*)[10] 자료형 pb. 크기는 8 바이트
int (**ppb)[10] = &pb; int (**)[10] 자료형 ppb. 크기는 8 바이트
int *c[10]; // int *[10] 자료형 c. 크기는 80 바이트
int *(*pc)[10] = &c; // int *(*)[10] 자료형 pc. 크기는 8 바이트
배열의 경우와 크게 다르지 않다. 만약 변수 ppa를 통해 변수 a에 접근하려면 **ppa 또는 ppa[0][0] 과 같이 적어주면 된다.
변수 ppb는 int [10] 자료형을 가리키는 포인터 int (*)[10] 을 가리키는 포인터이다. 괄호와 *의 위치를 기억해야 한다.
변수 c는 int *의 10개 짜리 배열이다. 따라서 크기는 80 바이트가 된다. 변수 pc는 변수 c의 자료형을 가리킨다.
●포인터의 형변환
포인터는 메모리 주소를 담는 자료형이고, 메모리 주소를 어떤 자료형으로 접근한다고 해도 메모리 주소가 바뀌지는 않
추천자료
[기술조사] GUI를 통한 윈도우 접속기술
MIDI(컴퓨터음악, 전자음악)의 정의와 도입, MIDI(컴퓨터음악, 전자음악)의 기본신호와 현대...
컴퓨터통신과인터넷족보
[컴퓨터활용][컴퓨터활용교육][교육적활용]영어과(영어과교육) 컴퓨터활용, 수학과(수학과교...
[컴퓨터활용교육]컴퓨터활용 영어교육(영어과교육), 컴퓨터활용 수학교육(수학과교육), 컴퓨...
eBay의 경영전략사례
영상처리기반 핸드마우스
[재활용, 폐컴퓨터 재활용, 폐타이어 재활용, 폐플라스틱 재활용, 폐수 재활용, 폐식용유(폐...
[벤처창업][벤처창업 업종선정과 사업계획수립]벤처창업의 개념, 벤처창업의 사전준비, 벤처...
정보 통신과 청각 장애
소개글