[C언어] 포인터에 대해서 알아봅시다.
Study/C, C+, C++

[C언어] 포인터에 대해서 알아봅시다.

728x90
반응형

포인터는, 주소를 저장하는 변수 입니다.

즉, 포인터는 다른 함수를 가리키는 화살표 같은 변수죠.

 

이를 이용해서, 특정 변수에 접근할 수 있도록 도와줍니다. 그리고 포인터변수의 크기는 모두 4바이트 입니다.

 

/* 메인 및 헤더 생략 */

char* aaa;
	int* bbb;
	double* ccc; /*sizeof(ccc) 로 크기 출력가능, 포인터 변수는 항상 4바이트.*/

	printf("aaa, bbb, ccc의 크기 : %d, %d, %d\n", sizeof(aaa), sizeof(bbb), sizeof(ccc));

실행결과

 

aaa, bbb, ccc의 크기 : 4, 4, 4

 

이렇게 확인이 가능합니다.

 

int aa1;
	int* pp1;
	pp1 = &aa1; /* aa1의 주소값을 포인터 변수 pp1에 대입을 함. aa1이 int 이기 때문에, int* 가 값임. */
    
    pp1 = &10; /* 상수의 주소를 구할 수 없음, 오류 발생 */
    pp1 = &(aa1 + 1); /* 수식의 주소를 구할 수 없음, 오류 발생 */

이게 주의할 점 입니다.

& 연산자는, 변수명 앞에서만 사용하기때문에 상수나 수식에는 쓰일 수 없습니다.

 

*pp1 = 50; /* 포인터함수 pp1 이 가리키는 함수 aa1에게 50이라는 값을 지정.*/
printf("%d", *pp1); /*포인터함수 pp1이 가리키는 값을 출력 = aa1 */

이렇게 이어서 해보면, *pp1 은 aa1을 가리키는 포인터 함수였고, *pp1 의 값을 50으로 설정하니

*pp1이 가리키는 함수 aa1은 50이 됩니다.

 

출력할때도 마찬가지구요.

하지만, 포인터함수를 선언하지 않은 경우에는 *를 사용할 수 없습니다. 또한 이러한 포인터는 이중으로 사용 할 수 있습니다.

 

int x;
int *p;
int **pp = &p;

**pp=10; /* p, x = 10 */

 

또한, 포인터 변수는 데이터형이 변수가 가르키는 변수의 데이터형과 일치해야합니다.

포인터도 역시, 초기화를 안하면 덤프값을 갖게 되며, 포인터를 지정하고 싶지 않다면 널 포인터로 지정해야합니다.

 

int *kor = NULL;

이렇게 하면, kor은 다른 변수를 가리키지 않습니다.

아래는 포인터를 안전하게 사용하는 방법입니다. 널 포인터인지 검사를 하는 방식입니다.

 

	if (kk != NULL) { /* 포인터가 NULL 인지 확인 */
		*kk = 10;
	}

포인터 : 다른 변수의 주소를 저장하는 변수

포인터의 선언 : 데이터형, *, 변수명이 필요 ( int *p )

포인터의 사용 : 변수의 주소를 구할때는 주소 구하기 연산자 & 사용, 변수에 접근할 때는 간접참조 연산자 * 사용.

주의사항 : 포인터 변수는 포인터가 가리키는 변수의 데이터형과 같아야함. 포인터가 가리키는 변수가 없을때는 NULL로 저장.

 

포인터와 배열의 관계

 

배열의 이름은 배열의 시작 주소이므로, 포인터 처럼 사용할 수 있음.

즉, arr[i] 는 *[arr  + i]와 같음.

 

배열의 원소를 가리키는 포인터는 배열처럼 사용가능.

즉, *(p + i)는 p[i]와 같음.

 

배열의 시작주소는 변경 못하지만, 포인터에 저장된 주소는 변경 가능.

 

문자열 리터럴 : 문자열의 리터럴 주소를 의미함.

즉, char *p = "abcde"; 에서 p 에는 "abcde"의 주소를 저장한다는 뜻.

 

문자열 포인터 : 문자열 포인터가 문자열 리터럴을 가리킬 때는 내용 변경을 할 수 없지만, 포인터가 배열을 가리킬 때는 변경 가능.

 

const 포인터 : 포인터를 선언할 때, const의 위치에 따라서 의미가 달라짐

 

const char *p = str1; 에서 p가 가리키는 str1의 내용을 변경 할 수 없음.(주소변경 가능)

char *const p = str1; 에서 p에 저장된 주소를 변경할 수 없음 (내용 변경 가능)

const char *const p = str1; 에서 p가 가르키는 문자열은 물론, p도 변경할 수 없음. (둘다 불가능)

728x90
반응형