내 잡다한 노트

C언어) 포인터, 이중포인터, 포인터와 배열 본문

Language/C언어

C언어) 포인터, 이중포인터, 포인터와 배열

peanutwalnut 2023. 3. 12. 10:50

포인터 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