happy coding
[lecture] C언어복습.포인터 활용 본문
이중 포인터(double pointer)란 포인터를 가리키는 포인터이다. 예를 들어 q는 포인터 p를 가리키는 이중 포인터인데 여기서 p는 int형 변수인 i를 가리키는 포인터이다. 여기서 **q 앞의 자료형은 q가 포인팅하는 변수의 타입이다.
*(*q) = 200인 경우 뒤쪽에 있는 *연산을 먼저 하고, 괄호 밖의 *연산을 진행한다.
이중 포인터를 사용하는 이유는, 포인터 값을 인수를 통해 받아와야 할 때 포인터의 주소를 통해 받아와야 하기 때문에 사용한다.
여기서 p[1]이 dzf로 바뀌지 않는 이유는 운영체제 에서 막아놨기 때문에(?) > 위의 배열과 포인터를 구분할 줄 알아야 한다.
문자열 배열에서 가장 많이 사용되는 건 포인터 배열이며, 이는 문자열들을 효율적으로 저장할 수 있다. 포인터 배열(array of pointers)은 포인터를 모아서 배열으로 만든 것이다.
문자열 상수는 문자열의 시작 번지를 반환한다. 포인터 배열의 각 원소들은 이 시작번지로 초기화된다.
함수 포인터(function pointer)는 함수를 가리키는 포인터이다. 형태는 반환형 (*함수포인터이름)(매개변수1, 매개변수2, ...); 함수도 메모리에 코드 형태로 존재하기에 함수도 주소를 가진다.
함수 포인터의 배열의 형태는 반환형 (*배열이름[배열의 크기])(매개변수목록); 이며,
함수 포인터는 인수로 전달 또한 가능해 특정 함수를 호출하게 할 수 있다.
다차원 배열과 포인터에서, 1행>2행>.. 순으로 행우선 방법으로 메모리에 저장하게 된다. 배열 이름 m은 &m[0][0]이고, 여기서 m[0]은 1행의 시작 주소를 의미한다. 각각의 배열의 이름인 m[0], m[1], m[2]는 그 배열의 시작 주소이다. 따라서 &m[0][0] == m[0], &m[1][0] == m[1], &m[2][0] == m[2] 로 표현할 수 있다. 2차원 배열과 포인터 연산에서, m[0] = m, m[1] = m+1, m[2] = m+2 각각의 시작주소가 같다. 여기서 m의 타입을 따져보았을 때, m[][]에서의 m은 integar형 3개의 배열을 포인터로 대응하는 int (*p) [3] = m; 이라고 말할 수 있다. m[0]의 타입은, int *q = m[0];
각 함수에 대한 main함수 만들기
void 포인터는 순수하게 메모리의 주소만 가지고 있는 포인터를 의미한다. 예를 들어, Hello World! 할 때 쓰는 void main(void){} > 괄호 안의 void는 argument가 없다라는 것을 의미, 반환형에서의 void는 반환할 게 없다는 의미이다. 여기서 가리키는 대상물은 아직 정해지지 않는다. 예를 들어 int main(void)는 일반적인 형태이고, int main(int argc, char *argv[])는 외부로부터 입력을 받는 main()함수 형태 이다.
~̆̈https://kldp.org/node/156899
https://www.geeksforgeeks.org/difference-between-int-p-and-int-p/
https://ggodong.tistory.com/28
https://m.blog.naver.com/sharonichoya/220501242693
'lecture > data structure' 카테고리의 다른 글
[lecture] C언어복습.연결리스트 (0) | 2022.12.29 |
---|---|
[lecture] C언어복습.동적메모리 (0) | 2022.12.29 |
[lecture] C언어복습.포인터 (0) | 2022.12.28 |
[lecture] C언어복습.배열 (0) | 2022.12.27 |
[lecture] C언어복습.구조체 (1) | 2022.12.27 |