내 잡다한 노트
C언어) 포인터, 이중포인터, 포인터와 배열 본문
포인터 2)
포인터 변수가 가리키고 있는 변수를 참조하려면 * 를 사용한다. 즉, int *ex = NULL; int data = 100; ex = &data;
printf("%d", *ex);
포인터 변수는 간단한 더하기와 뺄셈 연산으로 이웃한 변수의 주소 연산을 수행할 수 있다.
처음 int *pi에 100이라는 주소값이 저장돼있다고 하면 *(pi+1)을 하면 int의 크기가 4이니까 주소값이
104로 연산돼 저장이 된다. 만약 double 포인터 변수로 선언돼있다면 +1을 할 때 주소값은 +8이 되는 것이다.
포인터 변수는 동일한 자료형끼리만 대입이 가능하다.
이중포인터)
포인터 변수의 주소값을 갖는 변수를 이중 포인터라 한다. 즉, 포인터의 포인터인 셈이다.
int i = 20;
int *pi = &i;
int **dpi = π
*pi = i + 2; // i = 22
**dpi = *pi+2; // i = 24
*p++ 는 *(p++)이다. (*p)++와 다르다.
++*p 는 ++(*p) 이다.
*++p는 *(++p) 이다.
즉, * 앞에 괄호가 쳐진다고 생각하면 될 것 같다.
배열과 포인터 관계 )
배열 score가 있다고 가정하자. 이때 배열이름인 score는 &score[0]과 같다. 그래서 *score는 score[0]과 같다.
확장하면 *(score + i)는 score[i]와 같다. score+i는 &score[i]가 된다.
포인터로도 배열과 같이 인덱스를 사용하여 p[i]로 배열 원소를 참조할 수 있다.
다만 이렇게 하려면 포인터에는 배열의 첫번째 주소값이 들어가 있어야한다.
이차원 배열에서는 이중포인터를 이용하면 된다.
포인터 배열)
포인터도 자료형인 만큼 배열로 선언할 수 있다.
선언 : int *ptr[5] ;
배열 포인터)
열이 4인 이차원 배열 ary[][4]의 주소를 저장하려면 배열 포인터 변수 ptr을 문장 int (*ptr)[4]; 로 선언해야 한다.
이차원 배열의 주소를 저장하는 포인터 변수는 열 크기에 따라 변수 선언이 달라진다.
배열크기 계산법)
1차원 배열일때 )) sizeof(배열이름) / sizeof(배열원소) = 배열크기
2차원 배열일때 ))
이차원 배열의 행의 수 = sizeof(x) / sizeof(x[0])
열의 수 = sizeof(x[0]) / sizeof(x[0][0])
함수를 작성할 때 매개변수에 포인터를 쓰지 않으면 매개변수로는 값만 함수로 전달되고 함수 바깥의 변수에는
영향이 없게된다.
이때, 포인터를 사용한다. 함수의 매개변수 전달할 때, &를 이용하여 주소를 전달해준다.
이때, 주소를 매개변수로 전달했기 때문에 함수 안에 변수는 사용할 시에 변수 주소를 뜻하므로 값을
조작하고 싶을 때는 *를 이용하여 저장된 값으로 접근해야한다.
'Language > C언어' 카테고리의 다른 글
자주 쓰이는 C언어 헤더파일 간단한 설명 (0) | 2023.05.13 |
---|---|
C언어 배열포인터 (0) | 2023.05.13 |
memset, strcpy (0) | 2023.03.20 |
C언어) 입력, 배열, 문자열 (0) | 2023.03.08 |
C언어) 주석, 출력, 자료형 (0) | 2023.03.06 |