12장. 포인터
1. 포인터란 ?
- 주소 값의 저장을 목적으로 선언되는 포인터 변수
ex ) int num = 7 ;
int * pnum ; int형 포인터 변수(pnum) 선언
pnum = &num ; pnum에 num의 주소 저장
- 포인터 변수 또한 값을 저장하는 변수이기 때문에, int*, char*, double* 을 가리켜 포인터 형이라 한다.
- 포인터 형이 필요한 이유 : 메모리 공간을 참조하는 기준이 된다.
지정된 주소를 시작으로 몇바이트를 읽어들일지, 어떤 정수형으로 해석해야 하는지?
- 연산자 : & - 변수의 주소 값 반환
* - 포인터가 가리키는 메모리 공간에 접근
ex ) *pnum = 20 ; pnum이 가리키는 변수에 20을 저장하라
13장. 포인터와 배열
1. 포인터와 배열의 관계
- 배열의 이름은 값을 바꿀 수 없는 '상수 형태의 포인터' 이며, 배열의 시작 주소 값을 의미한다. arr = &arr[0] ;
- 배열의 포인터 형은 배열의 형과 같다.
- 포인터를 배열의 이름처럼 사용할 수 있다.
ex ) int * ptr = &arr[0] // int * ptr = arr 과 동일
printf( "%d %d" , ptr[0], arr[0] ) ; // 두개의 값이 같다 - 실제로 이렇게 사용하지는 않음.
2. 포인터 연산
- int 형 포인터 1 증가 : 크기 4 증가
- double형 포인터 1 증가 : 크기 8 증가
3. 문자열과 포인터
- 변수 형태의 문자열
char str1[] = "My String" ;
// str1 : 배열
// str1 자체에 문자열 저장
// 배열이름 str1 은 'M'의 주소값
// str1[0]='X' 문자열 변경 가능
- 상수 형태의 문자열
char * str2 = "Your String" ;
// str2 : 포인터 변수
// 포인터이름 str2 는 'Y' 의 주소값
// 메모리 공간에 문자열 저장 -> 메모리의 주소 값 으로 자동 반환
char * str =0x1234; 즉 문자열을 수정할 수 없음. str2[0] = 'X' 오류
// str2 는 가리키는 대상 변경 가능
ex) str2 = "my string" ;
4. 포인터 변수로 이뤄진 배열
- 포인터 배열 : int * arr[3]={&num1, &num2, &num3};
14장. 포인터와 함수
1. 함수의 인자로 배열 전달하기
- 인자전달의 기본방식은 값의 복사이다.
- 배열의 함수를 인자로 전달하는 방식
매개변수로 배열을 선언할 수 없음,
배열을 통째로 전달하는것이 불가능 하기 때문에, 주소값을 인자로 전달하여 이를 통하여 접근
- 배열을 함수의 인자로 전달받는 함수의 또 다른 선언
void showArayElem( int * arr, int len){...}
= void showArayElem( int arr[], int len){...} 아래가 배열을 인자로 전달되는 느낌을 강하게 준다!
추가적으로, 함수 내에서는 인자로 전달되니 배열의 길이를 계산할 수 없다.
sizeof(param) 시 포인터의 크기 4 출력 , 즉 배열의 크기도 함께 전달해야 함
2. 함수의 호출방식
- 값을 전달하는 형태의 함수호출 : Call-by-value ( 값의 복사 - 원본값 은 변하지 않음)
- 주소 값을 전달하는 형태의 함수호출 : Call-by-reference ( 주소를 가져와 원본값을 변경시킴)
3. 포인터 대상의 const 선언
- const int * ptr = &num ; 포인터 변수가 참조하는 대상의 변경 허용 불가!
*ptr= 30 ; // 에러!
- int * const ptr = &num ; 포인터 변수의 상수화, 주소값 변경 불가 !
ptr = &num2; // 에러!
*ptr = 40; // 성공!
- const int * const ptr = &num ; 참조 대상 및 주소값 두가지 모두 변경 불가 !
17장. 포인터의 포인터
1. 이중포인터
- 포인터 변수를 가리키는 또 다른 포인터 변수
- 주소값을 저장하는 변수
ex) double num = 3.14;
double *ptr = #
double **dptr = &ptr ;
- 포인터의 필요성은 자료구조에서 확실히 느낄수 있다!
열혈 C 프로그래밍 참조
'C언어' 카테고리의 다른 글
C언어 문자관련 함수와 버퍼 (0) | 2020.01.16 |
---|---|
C언어 다차원배열과 포인터 (0) | 2020.01.15 |
C언어 자료형과 기본 출력 함수 (0) | 2020.01.14 |