포인터는, 주소를 저장하는 변수 입니다.
즉, 포인터는 다른 함수를 가리키는 화살표 같은 변수죠.
이를 이용해서, 특정 변수에 접근할 수 있도록 도와줍니다. 그리고 포인터변수의 크기는 모두 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도 변경할 수 없음. (둘다 불가능)
'Study > C, C+, C++' 카테고리의 다른 글
[C언어] 포인터와 배열에 관한 개념 정리. (178) | 2019.06.20 |
---|---|
[C언어]포인터 연산에 대한 개념 정리. (182) | 2019.06.20 |
[C언어]배열, 다차원 배열과 문자열에 대해서 알아봅시다. (0) | 2019.04.21 |
[C언어] 변수와 데이터형 알아보기. (0) | 2019.04.20 |