C언어 정리
포인터.. 참 햇갈린다
배열관련해서 좀 헷갈리는데
int a[3] = {1,2,3}
위와 같은 배열중..
일단 C언어는 B언어와는 다르게
a, &a, &a[0] 모두 같은 값이라고 한다. (배열의 주소값 표현)
sizeof는 배열이름을 넣으면, 다른결과를 보인다. (a와 ,a[0] )
그리고, 그다음은 배열 포인터이다.
이차원 배열을 가리키기 위해서는 ** 형태가 아닌,
1. 열의 개수
2. 데이터 형 이 필요하다.
즉, int (* pa) [3] 은 2차원 배열을 표현할 수 있다.
(배열 이름이, 배열의 첫번째 원소 주소값의 타입 변환이 되는 것처럼,
int [3] 을 가리킬 수 있는 배열 포인터 하나로, 2차원 배열 전체를 가리킬 수 있다고 보면 되겠다. )
그리고,
a[3] = * (a + 3) 로 표현 가능하다.
int * pa[3] 은 포인터 배열이다. (포인터 들이 들어있는 배열)
예제)
#include <stdio.h>
int main()
{
int arr[2][3] = {{1,2,3},{4,5,6}};
printf("%p\n", arr[1]);
printf("%p\n", &arr[1][0]);
printf("%d\n",*(arr[1]));
printf("%d\n",arr[1][0]);
// printf("%d\n", **arr);
printf("%d\n", arr[0][2]);
printf("%d\n", *(&arr[0][0] + 2));
printf("%d\n", *(arr[0] + 2));
}
포인터를 이용한 함수 호출로, 데이터 swapping
- 포인터 (주소값) 를 사용하여, 해당 주소의 실제 데이터 (10011011 과 같은 바이너리데이터) 를,
스와핑할 변수에 대입한다. 변수 a, b의 주소값은 변하지 않는다. ( 헷갈리지 말것.. )
// address swapping
int swap(int * a, int * b) {
int temp = * a;
* a = * b;
* b = temp;
}